diff --git a/.copier-answers.yml b/.copier-answers.yml deleted file mode 100644 index c51e00fe6..000000000 --- a/.copier-answers.yml +++ /dev/null @@ -1,27 +0,0 @@ -# Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.35 -_src_path: git+https://github.com/OCA/oca-addons-repo-template -additional_ruff_rules: [] -ci: GitHub -convert_readme_fragments_to_markdown: true -enable_checklog_odoo: true -generate_requirements_txt: true -github_check_license: true -github_ci_extra_env: {} -github_enable_codecov: true -github_enable_makepot: true -github_enable_stale_action: true -github_enforce_dev_status_compatibility: true -include_wkhtmltopdf: false -odoo_test_flavor: Both -odoo_version: 19.0 -org_name: Odoo Community Association (OCA) -org_slug: OCA -rebel_module_groups: [] -repo_description: dms -repo_name: dms -repo_slug: dms -repo_website: https://github.com/OCA/dms -use_pyproject_toml: true -use_ruff: true - diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index d61380e4f..5eb021ef1 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -3,11 +3,11 @@ name: pre-commit on: pull_request: branches: - - "19.0*" + - "18.0*" push: branches: - - "19.0" - - "19.0-ocabot-*" + - "18.0" + - "18.0-ocabot-*" jobs: pre-commit: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 6101a2b02..a06488079 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,11 +3,11 @@ name: tests on: pull_request: branches: - - "19.0*" + - "18.0*" push: branches: - - "19.0" - - "19.0-ocabot-*" + - "18.0" + - "18.0-ocabot-*" jobs: unreleased-deps: @@ -35,14 +35,14 @@ jobs: fail-fast: false matrix: include: - - container: ghcr.io/oca/oca-ci/py3.10-odoo19.0:latest + - container: ghcr.io/oca/oca-ci/py3.10-odoo18.0:latest name: test with Odoo - - container: ghcr.io/oca/oca-ci/py3.10-ocb19.0:latest + - container: ghcr.io/oca/oca-ci/py3.10-ocb18.0:latest name: test with OCB makepot: "true" services: postgres: - image: postgres:13 + image: postgres:12.0 env: POSTGRES_USER: odoo POSTGRES_PASSWORD: odoo diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d61a329f9..73e8d1acc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -39,11 +39,11 @@ repos: language: fail files: '[a-zA-Z0-9_]*/i18n/en\.po$' - repo: https://github.com/sbidoul/whool - rev: v1.3 + rev: v1.2 hooks: - id: whool-init - repo: https://github.com/oca/maintainer-tools - rev: f9b919b9868143135a9c9cb03021089cabba8223 + rev: bf9ecb9938b6a5deca0ff3d870fbd3f33341fded hooks: # update the NOT INSTALLABLE ADDONS section above - id: oca-update-pre-commit-excluded-addons @@ -52,7 +52,7 @@ repos: - id: oca-gen-addon-readme args: - --addons-dir=. - - --branch=19.0 + - --branch=18.0 - --org-name=OCA - --repo-name=dms - --if-source-changed @@ -60,7 +60,7 @@ repos: - --convert-fragments-to-markdown - id: oca-gen-external-dependencies - repo: https://github.com/OCA/odoo-pre-commit-hooks - rev: v0.1.6 + rev: v0.0.33 hooks: - id: oca-checks-odoo-module - id: oca-checks-po @@ -79,8 +79,8 @@ repos: files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$ language: node additional_dependencies: - - "prettier@3.6.2" - - "@prettier/plugin-xml@3.4.2" + - "prettier@3.3.3" + - "@prettier/plugin-xml@3.4.1" - repo: local hooks: - id: eslint @@ -93,11 +93,11 @@ repos: types: [javascript] language: node additional_dependencies: - - "eslint@9.35.0" - - "eslint-plugin-jsdoc@57.0.8" + - "eslint@9.12.0" + - "eslint-plugin-jsdoc@50.3.1" - "globals@16.0.0" - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v6.0.0 + rev: v4.6.0 hooks: - id: trailing-whitespace # exclude autogenerated files @@ -106,6 +106,8 @@ repos: # exclude autogenerated files exclude: /README\.rst$|\.pot?$ - id: debug-statements + - id: fix-encoding-pragma + args: ["--remove"] - id: check-case-conflict - id: check-docstring-first - id: check-executables-have-shebangs @@ -117,13 +119,13 @@ repos: - id: mixed-line-ending args: ["--fix=lf"] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.13.0 + rev: v0.6.8 hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - id: ruff-format - repo: https://github.com/OCA/pylint-odoo - rev: v9.3.15 + rev: v9.1.3 hooks: - id: pylint_odoo name: pylint with optional checks diff --git a/.pylintrc b/.pylintrc index f3d017a8f..7c62b6d2e 100644 --- a/.pylintrc +++ b/.pylintrc @@ -10,7 +10,7 @@ manifest-required-authors=Odoo Community Association (OCA) manifest-required-keys=license manifest-deprecated-keys=description,active license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 -valid-odoo-versions=19.0 +valid-odoo-versions=18.0 [MESSAGES CONTROL] disable=all @@ -23,12 +23,21 @@ disable=all # config as a blocking check. enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, assignment-from-none, attribute-deprecated, + class-camelcase, dangerous-default-value, + dangerous-view-replace-wo-priority, development-status-allowed, + duplicate-id-csv, duplicate-key, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, eval-used, + incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -39,57 +48,57 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, + openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, + redundant-modulename-xml, reimported, + relative-import, return-in-init, + rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, + wrong-tabs-instead-of-spaces, + xml-syntax-error, attribute-string-redundant, + character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, + create-user-wo-reset-password, + dangerous-filter-wo-user, + dangerous-qweb-replace-wo-priority, + deprecated-data-xml-node, + deprecated-openerp-xml-node, + duplicate-po-message-definition, except-pass, + file-not-used, invalid-commit, manifest-maintainers-list, + missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, renamed-field-parameter, resource-not-exist, + str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, + unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, external-request-timeout, - bad-builtin-groupby, - category-allowed, - deprecated-name-get, - deprecated-odoo-model-method, - inheritable-method-lambda, - inheritable-method-string, - invalid-email, - manifest-behind-migrations, - manifest-data-duplicated, - missing-odoo-file, - no-raise-unlink, - no-search-all, - no-wizard-in-models, - prohibited-method-override, - prefer-env-translation, - translation-format-interpolation, - translation-format-truncated, - translation-fstring-interpolation, - translation-not-lazy, - translation-too-few-args, - translation-too-many-args, - translation-unsupported-format, - no-write-in-compute, # messages that do not cause the lint step to fail consider-merging-classes-inherited, create-user-wo-reset-password, @@ -105,8 +114,7 @@ enable=anomalous-backslash-in-string, old-api7-method-defined, redefined-builtin, too-complex, - unnecessary-utf8-coding-comment, - manifest-external-assets + unnecessary-utf8-coding-comment [REPORTS] diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory index 80567de1e..018fd61cd 100644 --- a/.pylintrc-mandatory +++ b/.pylintrc-mandatory @@ -9,18 +9,27 @@ manifest-required-authors=Odoo Community Association (OCA) manifest-required-keys=license manifest-deprecated-keys=description,active license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3 -valid-odoo-versions=19.0 +valid-odoo-versions=18.0 [MESSAGES CONTROL] disable=all enable=anomalous-backslash-in-string, + api-one-deprecated, + api-one-multi-together, assignment-from-none, attribute-deprecated, + class-camelcase, dangerous-default-value, + dangerous-view-replace-wo-priority, development-status-allowed, + duplicate-id-csv, duplicate-key, + duplicate-xml-fields, + duplicate-xml-record-id, + eval-referenced, eval-used, + incoherent-interpreter-exec-perm, license-allowed, manifest-author-string, manifest-deprecated-key, @@ -31,57 +40,57 @@ enable=anomalous-backslash-in-string, method-inverse, method-required-super, method-search, + openerp-exception-warning, pointless-statement, pointless-string-statement, print-used, redundant-keyword-arg, + redundant-modulename-xml, reimported, + relative-import, return-in-init, + rst-syntax-error, sql-injection, too-few-format-args, translation-field, translation-required, unreachable, use-vim-comment, + wrong-tabs-instead-of-spaces, + xml-syntax-error, attribute-string-redundant, + character-not-valid-in-resource-link, consider-merging-classes-inherited, context-overridden, + create-user-wo-reset-password, + dangerous-filter-wo-user, + dangerous-qweb-replace-wo-priority, + deprecated-data-xml-node, + deprecated-openerp-xml-node, + duplicate-po-message-definition, except-pass, + file-not-used, invalid-commit, manifest-maintainers-list, + missing-newline-extrafiles, missing-readme, missing-return, odoo-addons-relative-import, + old-api7-method-defined, + po-msgstr-variables, + po-syntax-error, renamed-field-parameter, resource-not-exist, + str-format-used, test-folder-imported, translation-contains-variable, translation-positional-used, + unnecessary-utf8-coding-comment, website-manifest-key-not-valid-uri, - external-request-timeout, - bad-builtin-groupby, - category-allowed, - deprecated-name-get, - deprecated-odoo-model-method, - inheritable-method-lambda, - inheritable-method-string, - invalid-email, - manifest-behind-migrations, - manifest-data-duplicated, - missing-odoo-file, - no-raise-unlink, - no-search-all, - no-wizard-in-models, - prohibited-method-override, - prefer-env-translation, - translation-format-interpolation, - translation-format-truncated, - translation-fstring-interpolation, - translation-not-lazy, - translation-too-few-args, - translation-too-many-args, - translation-unsupported-format, - no-write-in-compute + xml-attribute-translatable, + xml-deprecated-qweb-directive, + xml-deprecated-tree-attribute, + external-request-timeout [REPORTS] msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg} diff --git a/README.md b/README.md index 67a3c8217..5584161d9 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=19.0) -[![Pre-commit Status](https://github.com/OCA/dms/actions/workflows/pre-commit.yml/badge.svg?branch=19.0)](https://github.com/OCA/dms/actions/workflows/pre-commit.yml?query=branch%3A19.0) -[![Build Status](https://github.com/OCA/dms/actions/workflows/test.yml/badge.svg?branch=19.0)](https://github.com/OCA/dms/actions/workflows/test.yml?query=branch%3A19.0) -[![codecov](https://codecov.io/gh/OCA/dms/branch/19.0/graph/badge.svg)](https://codecov.io/gh/OCA/dms) -[![Translation Status](https://translation.odoo-community.org/widgets/dms-19-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/dms-19-0/?utm_source=widget) +[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0) +[![Pre-commit Status](https://github.com/OCA/dms/actions/workflows/pre-commit.yml/badge.svg?branch=18.0)](https://github.com/OCA/dms/actions/workflows/pre-commit.yml?query=branch%3A18.0) +[![Build Status](https://github.com/OCA/dms/actions/workflows/test.yml/badge.svg?branch=18.0)](https://github.com/OCA/dms/actions/workflows/test.yml?query=branch%3A18.0) +[![codecov](https://codecov.io/gh/OCA/dms/branch/18.0/graph/badge.svg)](https://codecov.io/gh/OCA/dms) +[![Translation Status](https://translation.odoo-community.org/widgets/dms-18-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/dms-18-0/?utm_source=widget) @@ -17,7 +17,17 @@ dms [//]: # (addons) -This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools. +Available addons +---------------- +addon | version | maintainers | summary +--- | --- | --- | --- +[dms](dms/) | 18.0.1.0.6 | | Document Management System for Odoo +[dms_auto_classification](dms_auto_classification/) | 18.0.1.0.0 | victoralmau | Auto classify documents into DMS +[dms_field](dms_field/) | 18.0.1.1.0 | CarlosRoca13 | Create DMS View and allow to use them inside a record +[dms_field_auto_classification](dms_field_auto_classification/) | 18.0.1.0.0 | victoralmau | Auto classify files into embedded DMS +[dms_user_role](dms_user_role/) | 18.0.1.0.0 | victoralmau | DMS User Role +[hr_dms_field](hr_dms_field/) | 18.0.1.0.0 | victoralmau | Add dms field for employees +[web_editor_media_dialog_dms](web_editor_media_dialog_dms/) | 18.0.1.0.1 | | Integrate DMS with media dialog of web editor [//]: # (end addons) diff --git a/dms/README.rst b/dms/README.rst new file mode 100644 index 000000000..75f77387a --- /dev/null +++ b/dms/README.rst @@ -0,0 +1,253 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========================== +Document Management System +========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:45ce312f2b0dafc58147b67c526a9005653f2ba9a9208468707b3a5986c7450c + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/19.0/dms + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-19-0/dms-19-0-dms + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +DMS is a module for creating, managing and viewing document files +directly within Odoo. This module is only the basis for an entire +ecosystem of apps that extend and seamlessly integrate with the document +management system. + +This module adds portal functionality for directories and files for +allowed users, both portal or internal users. You can get as well a +tokenized link from a directory or a file for sharing it with any +anonymous user. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Preview +------- + +``python-magic`` library is recommended to be installed for having whole +support to get proper file types and file preview. + +Configuration +============= + +Configuration +============= + +To configure this module, you need to: + +1. Create a storage +------------------- + +1. Go to *Documents -> Configuration -> Storages*. + +2. Create a new document storage. You can choose between three options + on ``Save Type``: + + - ``Database``: Store the files on the database as a field + - ``Attachment``: Store the files as attachments + - ``File``: Store the files on the file system + +2. Create an access group +------------------------- + +1. Next, create an administrative access group. Go to *Configuration -> + Access Groups*. + + - Create a new group, name it appropriately, and turn on all three + permissions (Create, Write and Unlink. Read is implied and always + enabled). + - Add any other top-level administrative users to the group if needed + (your user should already be there). + - You can create other groups in here later for fine-grained access + control. + +3. Create a directory +--------------------- + +1. Afterward, go to *Documents -> Directories*. + +2. Create a new directory, mark it as root and select the previously + created setting. + + - Select the *Groups* tab and add your administrative group created + above. If your directory was already created before the group, you + can also add it in the access groups (*Configuration -> Access + Groups*). + +3. In the directory settings, you can also add other access groups + (created above) that will be able to: + + - read + - create + - write + - delete + +Migration +========= + +If you need to modify the storage ``Save Type`` you might want to +migrate the file data. To achieve it, you need to: + +1. Go to *Documents -> Configuration -> Storage* and select the storage + you want to modify +2. Modify the save type +3. Press the button Migrate files if you want to migrate all the files + at once +4. Press the button Manual File Migration to specify files one by one + +You can check all the files that still need to be migrated from all +storages and migrate them manually on *Documents -> Configuration -> +Migration* + +File Wizard Selection +===================== + +There is an action called ``action_dms_file_wizard_selector`` to open a +wizard to list files in kanban view. This can be used (example +dms_attachment_link module) to add a button in kanban view with the +action we need. + +Usage +===== + +The best way to manage the documents is to switch to the Documents view. +Existing documents can be managed there and new documents can be +created. + +Portal functionality +-------------------- + +You can add any portal user to DMS access groups, and then allow that +group in directories, so they will see in the portal such directories +and their files. Another possibility is to click on "Share" button +inside a directory or a file for obtaining a tokenized link for single +access to that resource, no matter if logged or not. + +Known issues / Roadmap +====================== + +- Files preview in portal +- Allow to download folder in portal and create zip file with all + content +- Save in cache own_root directories and update in every + create/write/unlink function +- Add a migration procedure for converting an storage to attachment one + for populating existing records with attachments as folders +- Add a link from attachment view in chatter to linked documents +- If Inherit permissions from related record (the + inherit_access_from_parent_record field from storage) is changed when + directories already exist, inconsistencies may occur because groups + defined in the directories and subdirectories will still exist, all + groups in these directories should be removed before changing. +- Since portal users can read ``dms.storage`` records, if your module + extends this model to another storage backend that needs using + secrets, remember to forbid access to the secrets fields by other + means. It would be nice to be able to remove that rule at some point. +- Searchpanel in files: Highlight items (shading) without records when + filtering something (by name for example). +- Accessing the clipboard (for example copy share link of + file/directory) is limited to secure connections. It also happens in + any part of Odoo. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* MuK IT +* Tecnativa + +Contributors +------------ + +- Mathias Markl +- Enric Tobella +- Antoni Romera +- Gelu Boros +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + - Jairo Llopis + +- `Elego `__: + + - Yu Weng + - Philip Witte + - Khanh Bui + +- `Subteno `__: + + - Timothée Vannier + +- `Kencove `__: + + - Mohamed Alkobrosli + +Other credits +------------- + +Some pictures are based on or inspired by: + +- `Roundicons `__ +- `Smashicons `__ +- `EmojiOne `__ : Portal DMS icon +- `GitHub Octicons `__ : The main + DMS icon + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/dms/__init__.py b/dms/__init__.py new file mode 100644 index 000000000..ada0b87be --- /dev/null +++ b/dms/__init__.py @@ -0,0 +1,3 @@ +from . import controllers +from . import models +from . import wizards diff --git a/dms/__manifest__.py b/dms/__manifest__.py new file mode 100644 index 000000000..133076f53 --- /dev/null +++ b/dms/__manifest__.py @@ -0,0 +1,75 @@ +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "Document Management System", + "summary": """Document Management System for Odoo 19 (Migrated)""", + "version": "19.0.1.0.6", + "category": "Document Management", + "license": "LGPL-3", + "website": "https://github.com/OCA/dms", + "author": "MuK IT, Tecnativa, Odoo Community Association (OCA)", + "depends": [ + "mail", + "http_routing", + "onboarding", + "portal", + "base", + "web", + ], + "data": [ + # Security + "security/security.xml", + "security/ir.model.access.csv", + # Actions + "actions/file.xml", + # Templates + "template/portal.xml", + # Data + "data/onboarding_data.xml", + # Views + "views/dms_tag.xml", + "views/dms_category.xml", + "views/dms_file.xml", + "views/dms_directory.xml", + "views/storage.xml", + "views/dms_access_groups_views.xml", + "views/res_config_settings.xml", + "views/menu.xml", + "views/res_users.xml", + # Wizard + "wizards/wizard_dms_file_move_views.xml", + "wizards/wizard_dms_share_views.xml", + ], + "assets": { + "web.assets_backend": [ + # JS + "dms/static/src/models/*.js", + "dms/static/src/js/fields/path_json/path_owl.esm.js", + "dms/static/src/js/fields/preview_binary/preview_record.esm.js", + "dms/static/src/js/views/*.esm.js", + # XML + "dms/static/src/js/fields/path_json/path_owl.xml", + "dms/static/src/js/fields/preview_binary/preview_record.xml", + "dms/static/src/js/views/*.xml", + ], + "web.assets_frontend": [ + "dms/static/src/scss/portal.scss", + ], + "web.assets_tests": [ + "dms/static/tests/tours/**/*", + ], + }, + "demo": [ + "demo/res_users.xml", + "demo/access_group.xml", + "demo/category.xml", + "demo/tag.xml", + "demo/storage.xml", + "demo/directory.xml", + "demo/file.xml", + ], + "icon": "/dms/static/description/icon.png", + "application": True, +} diff --git a/dms/actions/file.xml b/dms/actions/file.xml new file mode 100644 index 000000000..84a8ff284 --- /dev/null +++ b/dms/actions/file.xml @@ -0,0 +1,14 @@ + + + + + Migrate + + + code + records.action_migrate() + + diff --git a/dms/controllers/__init__.py b/dms/controllers/__init__.py new file mode 100644 index 000000000..984e838ae --- /dev/null +++ b/dms/controllers/__init__.py @@ -0,0 +1,2 @@ +from . import main +from . import portal diff --git a/dms/controllers/main.py b/dms/controllers/main.py new file mode 100644 index 000000000..5898e80fb --- /dev/null +++ b/dms/controllers/main.py @@ -0,0 +1,15 @@ +# Copyright 2017-2019 MuK IT GmbH +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import http +from odoo.http import request + + +class OnboardingController(http.Controller): + @http.route("/config/dms.forbidden_extensions", type="json", auth="user") + def forbidden_extensions(self, **_kwargs): + params = request.env["ir.config_parameter"].sudo() + return { + "forbidden_extensions": params.get_param( + "dms.forbidden_extensions", default="" + ) + } diff --git a/dms/controllers/portal.py b/dms/controllers/portal.py new file mode 100644 index 000000000..e1eaa7d64 --- /dev/null +++ b/dms/controllers/portal.py @@ -0,0 +1,288 @@ +# Copyright 2020-2021 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée VANNIER (https://www.subteno.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). +import base64 +from typing import Optional # noqa # pylint: disable=unused-import + +from odoo import _, http +from odoo.http import content_disposition, request +from odoo.osv.expression import OR + +from odoo.addons.portal.controllers.portal import CustomerPortal +from odoo.addons.web.controllers.utils import ensure_db + + +class CustomerPortal(CustomerPortal): + def _dms_check_access(self, model, res_id, access_token=None): + """ + Check access to the record. + + :param str model: model + :param int res_id: res_id + :param Optional[str] access_token: access_token + + :return: item + """ + item = request.env[model].browse(res_id) + if access_token: + item = item.sudo() + if not item.check_access_token(access_token): + return False + else: + if not item.permission_read: + return False + return item + + def _prepare_home_portal_values(self, counters): + values = super()._prepare_home_portal_values(counters) + if "dms_directory_count" in counters: + ids = request.env["dms.directory"]._get_own_root_directories() + values["dms_directory_count"] = len(ids) + return values + + @http.route(["/my/dms"], type="http", auth="user", website=True) + def portal_my_dms( + self, sortby=None, filterby=None, search=None, search_in="name", **kw + ): + """ + Display the main page for the DMS module. + + :param Optional[str] sortby: The field to sort by + :param Optional[str] filterby: The field to filter by + :param Optional[str] search: The search term + :param Optional[str] search_in: The field to search in + + :return: response + :rtype: odoo.http.Response + """ + values = self._prepare_portal_layout_values() + ( + filterby, + searchbar_inputs, + searchbar_sortings, + sort_order, + sortby, + ) = self._searchbar_data(filterby, sortby) + # domain + domain = [ + ("id", "in", request.env["dms.directory"]._get_own_root_directories()), + ] + # search + if search and search_in == "name": + domain += OR([[], [("name", "ilike", search)]]) + # content according to pager and archive selected + items = request.env["dms.directory"].search(domain, order=sort_order) + request.session["my_dms_folder_history"] = items.ids + # values + values.update( + { + "dms_directories": items, + "page_name": "dms_directory", + "default_url": "/my/dms", + "searchbar_sortings": searchbar_sortings, + "searchbar_inputs": searchbar_inputs, + "search_in": search_in, + "sortby": sortby, + "filterby": filterby, + "access_token": None, + } + ) + return request.render("dms.portal_my_dms", values) + + @http.route( + ["/my/dms/directory/"], + type="http", + auth="public", + website=True, + ) + def portal_my_dms_directory( + self, + dms_directory_id=False, + sortby=None, + filterby=None, + search=None, + search_in="name", + access_token=None, + **kw, + ): + """ + Display the content of a directory. + + :param Optional[int] dms_directory_id: dms_directory_id + :param Optional[str] sortby: sortby + :param Optional[str] filterby: filterby + :param Optional[str] search: search + :param Optional[str] search_in: search_in + :param Optional[str] access_token: access_token + + :return: response + :rtype: odoo.http.Response + """ + ensure_db() + # operations + ( + filterby, + searchbar_inputs, + searchbar_sortings, + sort_order, + sortby, + ) = self._searchbar_data(filterby, sortby) + dms_directory_items, res = self._get_directories( + access_token, dms_directory_id, search, search_in, sort_order + ) + if not res: + return request.redirect("/" if access_token else "/my") + + dms_directory_sudo = res + # dms_files_count + dms_file_items = self._get_files( + access_token, dms_directory_id, search, search_in, sort_order + ) + + dms_parent_categories = dms_directory_sudo.sudo()._get_parent_categories( + access_token + ) + # values + values = { + "dms_directories": dms_directory_items, + "page_name": "dms_directory", + "default_url": "/my/dms", + "searchbar_sortings": searchbar_sortings, + "searchbar_inputs": searchbar_inputs, + "search_in": search_in, + "sortby": sortby, + "filterby": filterby, + "access_token": access_token, + "dms_directory": dms_directory_sudo, + "dms_files": dms_file_items, + "dms_parent_categories": dms_parent_categories, + } + return request.render("dms.portal_my_dms", values) + + def _get_files(self, access_token, dms_directory_id, search, search_in, sort_br): + """ + Get files from dms_directory_id + + :param Optional[str] access_token: access_token + :param int dms_directory_id: dms_directory_id + :param Optional[str] search: search + :param Optional[str] search_in: search_in + :param str sort_br: sort_br + + :return: dms_file_items + :rtype: odoo.model.dms_file + """ + if not dms_directory_id: + return request.env["dms.file"] + file_domain = [ + ("is_hidden", "=", False), + ("directory_id", "=", dms_directory_id), + ] + # search + if search and search_in == "name": + file_domain.append(("name", "ilike", search)) + + # items + file_model = request.env["dms.file"] + is_access_token_valid = file_model.check_access_token(access_token) + file_model = file_model.sudo() if is_access_token_valid else file_model + dms_file_items = file_model.search(file_domain, order=sort_br) + request.session["my_dms_file_history"] = dms_file_items.ids + return dms_file_items + + def _get_directories( + self, access_token, dms_directory_id, search, search_in, sort_order + ): + """ + Get directories from dms_directory_id + + :param Optional[str] access_token: access_token + :param int dms_directory_id: dms_directory_id + :param Optional[str] search: search + :param Optional[str] search_in: search_in + :param str sort_order: sort_br + + :return: dms_directory_items, res + :rtype: tuple[odoo.model.dms_directory, bool|odoo.model.dms_directory] + """ + # domain + domain = [("is_hidden", "=", False), ("parent_id", "=", dms_directory_id)] + # search + if search and search_in: + domain.append(("name", "ilike", search)) + + # content according to pager and archive selected + directory_model = request.env["dms.directory"] + directory_to_check = directory_model.browse(dms_directory_id) + is_access_token_valid = directory_to_check.check_access_token(access_token) + directory_model = ( + directory_model.sudo() if is_access_token_valid else directory_model + ) + dms_directory_items = directory_model.search(domain, order=sort_order) + + request.session["my_dms_folder_history"] = dms_directory_items.ids + res = self._dms_check_access("dms.directory", dms_directory_id, access_token) + return dms_directory_items, res + + def _searchbar_data(self, filterby, sortby): + """ + Prepare searchbar data for portal. + + :param str filterby: filterby + :param str sortby: sortby + + :return: filterby, searchbar_inputs, searchbar_sortings, sort_order, + sortby + :rtype: tuple[str, dict, dict, str, str] + """ + searchbar_sortings = {"name": {"label": _("Name"), "order": "name asc"}} + # default sortby + if not sortby: + sortby = "name" + sort_order = searchbar_sortings[sortby]["order"] + # search + searchbar_inputs = { + "name": {"input": "name", "label": _("Name")}, + } + if not filterby: + filterby = "name" + return ( + filterby, + searchbar_inputs, + searchbar_sortings, + sort_order, + sortby, + ) + + @http.route( + ["/my/dms/file//download"], + type="http", + auth="public", + website=True, + ) + def portal_my_dms_file_download(self, dms_file_id, access_token=None, **kw): + """ + Download a file. + + :param int dms_file_id: dms_file_id + :param Optional[str] access_token: access_token + + :return: response + :rtype: odoo.http.Response + """ + ensure_db() + res = self._dms_check_access("dms.file", dms_file_id, access_token) + if not res: + if access_token: + return request.redirect("/") + return request.redirect("/my") + + if res.attachment_id and request.env.user.has_group("base.group_portal"): + res = res.sudo() + file_content = base64.b64decode(res.content) + content_type = ("Content-Type", "application/octet-stream") + disposition_content = ( + "Content-Disposition", + content_disposition(res.name), + ) + return request.make_response(file_content, [content_type, disposition_content]) diff --git a/dms/data/onboarding_data.xml b/dms/data/onboarding_data.xml new file mode 100644 index 000000000..3da127265 --- /dev/null +++ b/dms/data/onboarding_data.xml @@ -0,0 +1,75 @@ + + + + + + Storage + Create a new Document Storage. + Create Storage + Document Storage Created! + action_open_documents_onboarding_storage + + onboarding_default.png + Onboarding Storage + 1 + + + + Directory + Create a new Root Directory. + Create Directory + Root Directory Created! + action_open_documents_onboarding_directory + + onboarding_default.png + Onboarding Directory + 2 + + + + File + Upload your first File. + Upload File + First File Uploaded! + action_open_documents_onboarding_file + + onboarding_default.png + Onboarding File + 3 + + + + File Onboarding + + document_onboarding_file + action_close_panel_dms_file + + diff --git a/dms/demo/access_group.xml b/dms/demo/access_group.xml new file mode 100644 index 000000000..136445b33 --- /dev/null +++ b/dms/demo/access_group.xml @@ -0,0 +1,18 @@ + + + + Admin + True + True + True + + + + Portal + + + + User + + + diff --git a/dms/demo/category.xml b/dms/demo/category.xml new file mode 100644 index 000000000..b6d168115 --- /dev/null +++ b/dms/demo/category.xml @@ -0,0 +1,31 @@ + + + + + Internal + + + Human Resource + + + + Contracts + + + + Traveling + + + + External + + + News + + + diff --git a/dms/demo/directory.xml b/dms/demo/directory.xml new file mode 100644 index 000000000..5d97396ac --- /dev/null +++ b/dms/demo/directory.xml @@ -0,0 +1,147 @@ + + + + + Documents + + + + + + + + + + Media + + + + + + + + + Sheets + + + + + + + Templates + + + + + + + + Photos + + + + + + + + 2017 + + + + + + + 2018 + + + + + + + Videos + + + + + + Music + + + + + + Graphics + + + + + Mails + + + + + + + + + Data + + + + + + + Code + + + + + + + Slides + + + + + + Partners + + + + + + res.partner + + diff --git a/dms/demo/file.xml b/dms/demo/file.xml new file mode 100644 index 000000000..29c91d7ac --- /dev/null +++ b/dms/demo/file.xml @@ -0,0 +1,241 @@ + + + + + Sydney.jpg + + + + + + + Logo_01.jpg + + + + + + Logo_02.jpg + + + + + + + Logo_03.jpg + + + + + + Logo.svg + + + + + + + Loop_01.wav + + + + + + + Loop_02.wav + + + + + + + Loop_03.mp3 + + + + + + + Loop_04.mp3 + + + + + + + Video.mp4 + + + + + + + Mail_01.eml + + + + + + + Mail_02.eml + + + + + + Text.txt + + + + + + ASPECTJ.aj + + + + + + Bash.sh + + + + + C.c + + + + + Cplusplus.cc + + + + + CSharp.cs + + + + + COBOL.cbl + + + + + CoffeeScript.coffee + + + + + Fortran.f + + + + + Go.go + + + + + Groovy.groovy + + + + + Java.java + + + + + Scala.sc + + + + + Sample.md + + + + + Document_05.pdf + + + + + + Slide_01.odp + + + + + Slide_02.ppt + + + + + Document_02.doc + + + + + + Document_03.odt + + + + + + Sheet_01.xls + + + + + + Sheet_02.csv + + + + + + Sheet_03.ods + + + + + + Document_04.rtf + + + + + + Text.rst + + + + + diff --git a/dms/demo/res_users.xml b/dms/demo/res_users.xml new file mode 100644 index 000000000..c586a6007 --- /dev/null +++ b/dms/demo/res_users.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/dms/demo/storage.xml b/dms/demo/storage.xml new file mode 100644 index 000000000..2af754494 --- /dev/null +++ b/dms/demo/storage.xml @@ -0,0 +1,20 @@ + + + + + Documents Storage + database + + + Attachment Storage + attachment + + + + + diff --git a/dms/demo/tag.xml b/dms/demo/tag.xml new file mode 100644 index 000000000..69d6d1786 --- /dev/null +++ b/dms/demo/tag.xml @@ -0,0 +1,64 @@ + + + + + Customer + 1 + + + + Partner + 2 + + + + Project + 3 + + + + Sales + 4 + + + + Portal + 5 + + + + Apps + 6 + + + + Accounting + 7 + + + + Customer Invoice + 8 + + + + Vendor Bill + 9 + + + + Product + 10 + + + + Contract + 11 + + + diff --git a/dms/i18n/de.po b/dms/i18n/de.po new file mode 100644 index 000000000..09e989003 --- /dev/null +++ b/dms/i18n/de.po @@ -0,0 +1,2308 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-09-18 11:18+0000\n" +"PO-Revision-Date: 2023-09-18 11:18+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Legen Sie fest, wie ankommende E-Mails behandelt werden:\n" +"\n" +" - Einzelne Dateien: Die E-Mail wird im Verzeichnis " +"gespeichert und\n" +" alle Anhänge werden als Dateien gespeichert.\n" +"\n" +" - Unterverzeichnis: Für jede E-Mail wird ein neues " +"Unterverzeichnis erstellt\n" +" und die E-Mail in dieses gespeichert. Die Anhänge\n" +" werden als Dateien in diesem Unterverzeichnis gespeichert.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Dateien" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Unterverzeichnisse" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Dokumente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Ein Python-Dictionary, das ausgewertet wird, um beim Erstellen neuer " +"Datensätze für diesen Alias Standardwerte bereitzustellen." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "Ein Stammverzeichnis kann kein Oberverzeichnis besitzen." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Ein Verzeichnis benötigt ein Oberverzeichnis." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" +"Ein Verzeichnis benötigt ein Datenmodell, wenn Anhänge als Speicherort " +"gewählt wurde." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Es existiert bereits ein Verzeichnis mit diesem Namen." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" +"Eine Datei benötigt ein Datenmodell und eine Resource-ID, wenn Anhänge als " +"Speicherort gewählt wurde." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Ein Stammverzeichnis benötigt einen Speicherort." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Abstraktes DMS-Mixin" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Erlaube E-Mails von" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Zugriffsgruppen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Zugriffsinformationen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Zugriffswarnung" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Abrechnung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Aktion nötig" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Aktiv" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Aktivitäten" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Aktivitätsfehler-Dekoration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "Aktivitätsstatus" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Aktivitätstyp-Icon" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Neues Verzeichnis hinzufügen." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Neue Datei hinzufügen." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Alias Kontakt Sicherheit" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Alias-Bezeichnung" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Alias-Einstellung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Extraktion von Alias-Mails" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Alias-Modell" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Alle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Alle Dateien" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Während des Uploads ist ein Fehler aufgetreten" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Anwendungen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "Archiviert" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "Archivierte Dateien" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Dateianhang" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Anzahl der Anhänge" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "Anhangsdatei" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Basis" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Abbrechen" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Kategorien" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "Kategorien werden genutzt, um Dokumente zu ordnen." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Kategorie" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "Es existiert bereits eine Kategorie mit diesem Namen!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "Prüfsumme / SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Unterkategorien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Untergruppen" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Klicken, um ein neues Verzeichnis anzulegen." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Klicken, um eine Datei hinzuzufügen." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Klicken, um ein Stichwort hinzuzufügen." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Geschlossen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Farbe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Farbindex" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Unternehmen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Unternehmen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Vollständige Gruppen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Vollständige Bezeichnung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Vollständige Verzeichnisse" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationseinstellungen" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Konfiguration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Inhalt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Binary-Inhalt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Datei-Inhalt" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Vertrag" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Verträge" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "Anzahl der Verzeichnisse" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "Anzahl der Elemente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "Anzahl der Dateien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "Anzahl Titel Dateien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "Anzahl der Unterkategorien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "Anzahl der Unterverzeichnisse" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "Anzahl Titel Unterverzeichnisse" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "Anzahl der Stichwörter" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "Anzahl der Benutzer" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Anlegen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Anlageberechtigung" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Verzeichnis anlegen" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Speicherort anlegen" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Neue Kategorie anlegen." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Neuen Speicherort anlegen." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Neues Stammverzeichnis anlegen." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Neues Speicherort-Objekt anlegen." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Dateien von Nachrichtenanhängen anlegen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Erstellt von" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Erstellt am" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Erstelldatum" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Aktueller Speichertyp" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Benutzerdefinierte Bounce-Nachricht" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Kunde" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Kundenrechnung" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "Portal-URL des Kunden" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "DMS-Sicherheit-Mixin" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "DMS-Miniaturansicht und Symbol-Mixin" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Datenbank" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Standardwerte" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Verbotene Dateiendungen festlegen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "Legt eine Liste von verbotenen Dateiendungen fest (z.B. 'exe', 'msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" +"Legt die maximale Uploadgröße einer Datei in MB fest. (Standardwert: 25MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Löschberechtigung" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Verzeichnisse" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Mithilfe von Verzeichnissen können Dateien direkt in Odoo\n" +" organisiert und strukturiert werden." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Verzeichnis" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Dokumentenkategorie" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Dokumenten-Stichwort" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Dokumente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "Dokumente Onboarding-Verzeichnis Status" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "Dokumente Onboarding-Dateistatus" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "Dokumente Onboarding-Status" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "Dokumente Onboarding Speicherstatus" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Erledigt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Elemente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "E-Mail-Alias" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "E-Mail Thread" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "Fehler! Kategorien können nicht rekursiv angelegt werden." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "Fehler! Verzeichnisse können nicht rekursiv angelegt werden." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Explizite Benutzer" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Dateiendung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Dateiendungen" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Extern" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "Datei" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Datei-Upload" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "Dateien" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "Dateien werden genutzt, um Inhalte direkt in Odoo zu speichern." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Dateiablage" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Abonnenten" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Abonnenten (Partner)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "\"Font awesome\" Icon (z.B. fa-tasks)" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Allgemeine Einstellungen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Gruppe" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Gruppieren nach" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Gruppenname" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Gruppen-Benutzer" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Gruppen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "Hat Nachricht" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Personalwesen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID des übergeordneten Datensatzes, der den Alias enthält (Beispiel: Projekt, " +"das den Alias für die Aufgabenerstellung enthält)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "Icon-URL" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Symbol zur Kennzeichnung einer Ausnahmeaktivität." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Wenn eine Datei auf archiviert gesetzt ist, wird sie nicht angezeigt, ist " +"aber weiterhin vorhanden." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Falls markiert, benötigen neue Nachrichten Ihre Aufmerksamkeit." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" +"Wenn diese Überprüfung aktiviert ist, weisen einige Nachrichten einen " +"Übermittlungsfehler auf." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"Wenn diese Option festgelegt ist, sind Verzeichnisse und Dateien nur für das " +"ausgewählte Unternehmen verfügbar." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"Wenn diese Option festgelegt ist, wird dieser Inhalt anstelle der " +"Standardnachricht automatisch an nicht autorisierte Benutzer gesendet." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Bild" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Bild 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Bild 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Bild 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Bild 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Geben Sie an, ob Verzeichnisse und Dateien auch im E-Mail-" +"Kompositionsprozess automatisch erstellt werden" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "Gibt an, ob Verzeichnisse und Dateien standardmäßig ausgeblendet sind." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Gibt an, ob es sich bei dem Verzeichnis um ein Stammverzeichnis handelt.\n" +" Ein Stammverzeichnis hat ein Einstellungsobjekt, während ein " +"Verzeichnis mit einem gesetzten\n" +" Oberverzeichnis die Einstellungen von seinem übergeordneten Element " +"erbt." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Erbe Gruppen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Erbe Berechtigungen vom verlinkten Objekt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Erbe Anlageberechtigung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Erbe Löschberechtigung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Erbe Schreibberechtigung" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Intern" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Interne / Personal-Ressource" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "Ungültige Anhänge!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Rechnungen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "Ist ein Abonnent" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "Ist ein Stammverzeichnis" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "Es ist nicht möglich, den Speicherort zu ändern." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Gerade erledigt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Zuletzt aktualisiert von" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Zuletzt aktualisiert am" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Letzte Aktualisierung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Verlinkte Datenmodelle" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Verlinktes Anhangsmodell" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "ID des verknüpften Anhangs-Datensatzes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Sperren" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Gesperrt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Gesperrt von" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Manuelle Datei-Migration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Nachrichtenübertragungsfehler" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Nachrichten" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Meta-Daten" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migrieren" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Dateien migrieren" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "Migrationsstatus" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modell" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Änderungsdatum" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Meine Aktivitätsfrist" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Meine Verzeichnisse" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "Meine Dokumente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "Meine Dateien" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Neues Stammverzeichnis" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Neuer Speicherort" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Neuigkeiten" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Frist der nächsten Aktivität" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Zusammenfassung der nächsten Aktivität" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Typ der nächsten Aktivität" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "Es wurde kein zur Verfügung gestellt" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "Nicht fertig" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Keine Ergebnisse" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Anzahl der Aktionen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Anzahl der Fehler" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Anzahl der Meldungen, die Maßnahmen erfordern" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Anzahl der Nachrichten mit Übertragungsfehler" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Diese Aktion kann nur von einem Manager durchgeführt werden." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"Optionale ID eines Threads (Datensatzes), an den alle eingehenden " +"Nachrichten angehängt werden, auch wenn darauf nicht geantwortet wurde. Ist " +"diese Option gesetzt, wird die Erstellung neuer Datensätze vollständig " +"deaktiviert." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organisation" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Oberkategorie" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Oberverzeichnis" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Obergruppe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Obermodell" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Elternpfad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "Thread-ID des übergeordneten Datensatzes" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "Die übergeordnete Gruppe '%(parent)s' ist ein Kind von '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Übergeordnetes Modell, das den Alias enthält. Das Modell, das den Alias-" +"Referenzwert enthält, ist nicht notwendigerweise das durch alias_model_id " +"angegebene Modell (Beispiel: Projekt (parent_model) und Aufgabe (model))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Json-Pfad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "Pfadnamen" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Richtlinie zum Veröffentlichen einer Nachricht auf dem Dokument über das " +"Mailgateway.\n" +"- Jeder: jeder kann posten\n" +"- Partner: nur authentifizierte Partner\n" +"- Abonnenten: nur Abonnenten des entsprechenden Dokuments oder Mitglieder " +"der folgenden Kanäle\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL für Portalzugriff" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Vorschau" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Produkt" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Projekt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Leseberechtigung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "Zugriffsgruppen des Datensatzes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Referenzierter Datensatz" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "Thread-ID des Datensatzes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Migration benötigt" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Verantwortlicher Benutzer" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Stammverzeichnisse" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Verkäufe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Speichertyp" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Scannen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Sicherheitstoken" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Einstellungen" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Teilen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Speicherorte anzeigen" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "Einzelne Dateien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Größe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Sternchen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Verzeichnisse mit Sternchen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Sterne" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Status basierend auf Aktivitäten\n" +"Überfällig: Fälligkeitsdatum ist bereits überschritten\n" +"Heute: Aktivitätsdatum ist heute\n" +"Geplant: Zukünftige Aktivitäten." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Speicherort" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "Speicherort ist verborgen" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Speicherorte" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Speicherorte werden verwendet, um Dokumente zu konfigurieren." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Unterkategorien" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Unterverzeichnisse" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Unterverzeichnis" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Stichwort" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "Es existiert bereits ein Stichwort mit diesem Namen!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Stichwörter" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "Stichwörter werden genutzt, um Dokumente zu kategorisieren." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Stichwörter..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Technische Informationen" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" +"Das Aktiv-Feld ermöglicht es Ihnen, die Kategorie auszublenden, ohne sie zu " +"entfernen." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "" +"Das Aktiv-Feld ermöglicht es Ihnen, das Stichwort auszublenden, ohne es zu " +"entfernen." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "Der Name des Verzeichnisses ist ungültig." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "Dies ist ein verbotener Dateityp." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "Der Name der Datei ist ungültig." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "Die maximale Upload-Größe beträgt %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"Das Modell (Odoo Document Kind), dem dieser Alias entspricht. Jede " +"eingehende E-Mail, die nicht auf einen bestehenden Datensatz antwortet, " +"führt zur Erstellung eines neuen Datensatzes dieses Modells (z. B. einer " +"Projektaufgabe)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"Der Name des E-Mail-Alias, z. B. \"jobs\", wenn Sie E-Mails für " +" abfangen möchten." + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "Der Gruppenname muss eindeutig sein!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Dieses Verzeichnis muss einem Datensatz zugeordnet werden." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Gesamtanzahl der Elemente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Gesamtanzahl der Dateien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Gesamtanzahl der Unterverzeichnisse" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "Reisen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Typ" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Art der Ausnahmeaktivität des Datensatzes." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Löschberechtigung" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Entsperren" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "E-Mail entpacken als" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Hochladen" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Datei hochladen" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Erste Datei hochladen." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Benutzer" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Benutzer" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Lieferantenrechnung" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Website-Nachrichten" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Historie der Website-Kommunikation" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Schreibberechtigung" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "Sie müssen zuerst ein Verzeichnis auswählen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "Element(e)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe, msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" + +#~ msgid "Actions" +#~ msgstr "Aktionen" + +#~ msgid "Views" +#~ msgstr "Ansichten" diff --git a/dms/i18n/dms.pot b/dms/i18n/dms.pot new file mode 100644 index 000000000..12f027523 --- /dev/null +++ b/dms/i18n/dms.pot @@ -0,0 +1,2227 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each email\n" +" and the mail is attached to this subdirectory. The attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those of the folder that contains it, therefore, it is possible that when you change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task" +" creation alias)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access" +" (for example, if some directories are related with any sale, only users " +"with read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process " +"too" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a set\n" +" parent inherits the settings form its parent." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not" +" necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following channels\n" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming" +" email that does not reply to an existing record will cause the creation of " +"a new record of this model (e.g. a Project Task)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you" +" change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" diff --git a/dms/i18n/es.po b/dms/i18n/es.po new file mode 100644 index 000000000..d2c7ee3e2 --- /dev/null +++ b/dms/i18n/es.po @@ -0,0 +1,2312 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-20 08:48+0000\n" +"PO-Revision-Date: 2024-05-20 10:49+0200\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Defina cómo se procesan los correos electrónicos entrantes:\n" +"\n" +" - Archivos individuales: el correo electrónico se adjunta a " +"la carpeta y\n" +" todos los adjuntos se crean como archivos.\n" +"\n" +" - Subcarpeta: se crea una nueva subcarpeta para cada correo " +"electrónico\n" +" y el correo se adjunta a esta subcarpeta. Los adjuntos\n" +" se crean como archivos de la subcarpeta.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Archivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Subcarpetas" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" +"\n" +" ATENCIÓN: Consejos a tener en cuenta antes de " +"mover los archivos:
\n" +" - Este cambio no se puede deshacer.
\n" +" - Recuerda que los permisos de los archivos son los del " +"directorio que lo contiene, por lo tanto, es posible que al cambiarlo, los " +"permisos también cambien.
\n" +" Haz este cambio bajo tu responsabilidad." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +" @ " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Un diccionario de Python que se evaluará para proporcionar valores " +"predeterminados al crear nuevos registros para este alias." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "Una carpeta no puede ser raíz y tener una carpeta padre." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Una carpeta debe tener una carpeta padre." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" +"Un directorio debe tener un modelo en el almacenamiento de archivos adjuntos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Una carpeta con el mismo nombre ya existe." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" +"Un archivo debe tener un ID de modelo y recurso en el almacenamiento de " +"archivos adjuntos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Un directorio root debe tener un almacenamiento." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Mezcla Dms abstracta" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Aceptar emails de" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Grupos de acceso" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Información de acceso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Aviso de acceso" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Contabilidad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Acción necesaria" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Activo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Actividades" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoración de excepción de actividad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "Estado de actividad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icono para el tipo de actividad" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Añadir un nuevo archivo." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Añadir un nuevo archivo." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "Admin" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "Alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Seguridad de contacto de alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Nombre del alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Opción de alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Extracción de alias de correo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Modelo con alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Todo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Todos los archivos" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Se ha producido un error durante la carga" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Aplicaciones" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "Archivado" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "Archivos archivados" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "¿Estás seguro? Todos los archivos se moverán." + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Adjunto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Nº de adjuntos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "Archivo adjunto" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Base/Fuente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Categorías" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "Las categorías son usadas para categorizar documentos." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Categoría" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "¡El nombre de la categoría ya existe!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "Verificación de suma/SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Categorías hijas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Grupos hijos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Click para añadir una nueva carpeta." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Click para añadir un nuevo archivo." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Click para crear una nueva etiqueta." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Cerrado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Color" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Índice de color" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Compañía" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Grupos completos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Nombre completo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Directorios completos" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Opciones de configuración" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Configuración" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Contenido" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Contenido binario" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Contenido de archivo" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Contrato" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Contratos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "Nº de carpetas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "Nº de elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "Nº de archivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "Título de los archivos de recuento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "Nº de subcategorías" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "Nº de subcarpetas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "Título de las carpetas de recuento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "Nº de etiquetas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "Conteo de usuarios" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Crear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Acceso de creación" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Crear carpeta" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Crear almacenamiento" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Crear una nueva categoría." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Crear un nuevo documento de almacenamiento." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Crear una nueva carpeta raíz." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Crear un nuevo objeto de almacenamiento." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Crear archivos a partir de archivos adjuntos de mensajes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Fecha de creación" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Tipo de guardado actual" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Mensaje de rebote personalizado" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Cliente" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Factura de cliente" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "URL del portal del cliente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "Carpetas" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mezcla de seguridad DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "Mezcla de iconos y miniaturas de DMS" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Base de datos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Valores por defecto" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Define extensiones de archivo prohibidos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" +"Define una lista de extensiones de archivo prohibidas. (Ejemplo: 'exe,msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "Define el tamaño máximo de carga en MB. Por defecto (25 MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Acceso de eliminación" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Carpetas" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Las carpetas se pueden utilizar para estructurar y organizar\n" +" archivos directamente en Odoo." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Carpeta" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Categoría del documento" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Etiqueta del documento" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "Estado del directorio de incorporación de documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "Estado de archivo de incorporación de documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "Estado de incorporación de documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "Estado de almacenamiento de incorporación de documentos" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Hecho" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "Editor" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "Alias de email" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "Hilo de correo electrónico" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "¡Error! No puedes crear categorías recursivas." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "¡Error! No puedes crear carpetas recursivas." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Usuarios explícitos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Extensión" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Extensiones" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Externo" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "Archivo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Archivo subido" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "Archivos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "Los archivos se usan para guardar el contenido directamente en Odoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Almacenamiento" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Contactos)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icono de fuente impresionante, por ejemplo fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Opciones generales" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Grupo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Nombre del grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Usuarios del grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Grupos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "Tiene mensaje" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Recursos humanos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "ID" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID del registro principal que contiene el alias (ejemplo: proyecto que " +"contiene el alias de creación de la tarea)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "Icono" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "URL del icono" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icono para indicar una actividad de excepción." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Si un archivo está definido como archivado, no se mostrará, pero todavía " +"existe." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si está marcado los nuevos mensajes requieren su atención." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si está marcado algunos mensajes tienen error de entrega." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"Si se configura, las carpetas y archivos solo estarán disponibles para la " +"empresa seleccionada." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"Si se establece, este contenido se enviará automáticamente a usuarios no " +"autorizados en lugar del mensaje predeterminado." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Imagen" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Imagen 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Imagen 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Imagen 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Imagen 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Indique si los directorios y los archivos también se crean automáticamente " +"en el proceso de composición del correo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" +"Indica si las carpetas y archivos están ocultos de forma predeterminada." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Indica si la carpeta es una carpeta raíz.\n" +" Una carpeta raíz tiene un objeto de configuración, mientras que una " +"carpeta con un\n" +" padre hereda la configuración de su padre." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Grupos heredados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Heredar permisos del registro relacionado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Crear acceso heredado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Acceso no enlazado heredado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Acceso de escritura heredado" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Interno" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Interno / Recursos humanos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "¡Archivos adjuntos no válidos!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Facturas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "Es seguidor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "Es carpeta raíz" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "No es posible cambiar el almacenamiento." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Justo ahora" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Última actualización" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Modelos vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Modelo de adjuntos vinculado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "ID de registro de archivos adjuntos vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Bloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Bloqueado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Bloqueado por" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "Responsable" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Migración de archivo manual" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Error de entrega de mensaje" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Mensajes" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Información meta" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migrar" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" +"Migrar archivo %(index)s of %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Migrar archivos" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "Migración" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "Estado de migración" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modelo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Fecha de modificación" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "Mover" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "Mover archivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Fecha límite de mi actividad" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Mis directorios" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "Mis documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "Mis archivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "Nombre" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Nuevo directorio raíz" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Nuevo almacenamiento" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Novedades" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Fecha fin siguiente actividad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Resumen de siguiente actividad" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo de siguiente actividad" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "No se proporcionó ningún anexo" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "No hecho" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Sin resultados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de acciones" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Número de error" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensajes que requieren una acción" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensajes con error de entrega" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "Solo los archivos con la misma carpeta raíz se pueden mover." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Solo los responsables pueden ejecutar esta acción." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"ID opcional de un hilo (registro) al que se adjuntarán todos los mensajes " +"entrantes, incluso si no respondieron. Si se establece, esto deshabilitará " +"la creación de nuevos registros por completo." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organizar" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Propietario" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Categoría padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Carpeta padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Grupo padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Modelo padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "Ruta padre" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "El grupo parental 'l%(parent)s' es hijo de '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Modelo principal que tiene el alias. El modelo que contiene la referencia de " +"alias no es necesariamente el modelo dado por alias_model_id (ejemplo: " +"proyecto (parent_model) y tarea (modelo))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "Contacto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Ruta Json" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "Nombres de ruta" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Política para publicar un mensaje en el documento mediante el mailgateway.\n" +"- todos: todos pueden publicar\n" +"- socios: solo socios autenticados\n" +"- seguidores: solo seguidores del documento relacionado o miembros de los " +"siguientes canales\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "Portal" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL de acceso al portal" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Vista Anticipada" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Producto" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Proyecto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Acceso de lectura" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "Grupos de acceso de registro" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Registro referenciado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "ID de hilo de registro" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Requiere migración" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Usuario responsable" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Carpetas raíz" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "Directorio Raíz" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Ventas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Tipo guardado" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Escanear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Token de seguridad" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Opciones" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Compartir" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Mostrar almacenamientos" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "Archivos individuales" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Tamaño" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Destacado" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Carpetas destacadas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Estrellas" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Estado basado en actividades\n" +"Vencido: la fecha de vencimiento ya pasó\n" +"Hoy: la fecha de actividad es hoy\n" +"Planificado: actividades futuras." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Almacenamiento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "Almacenamiento está oculto" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Almacenamientos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Los almacenamientos se utilizan para configurar sus documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Subcarpetas" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Subcarpetas" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Subcarpeta" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "Sistema" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Etiqueta" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "¡El nombre de la etiqueta ya existe!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Etiquetas" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "Las etiquetas se usan para categorizar documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Etiquetas..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Información técnica" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "El campo activo le permite ocultar la categoría sin eliminarla." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "El campo activo le permite ocultar la etiqueta sin quitarla." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "El nombre de la carpeta es inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "El archivo tiene una extensión prohibida." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "El nombre de archivo es inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "El tamaño máximo de subida es %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"El modelo (tipo de documento de Odoo) al que corresponde este alias. " +"Cualquier correo electrónico entrante que no responda a un registro " +"existente provocará la creación de un nuevo registro de este modelo (por " +"ejemplo, una tarea de proyecto)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"El nombre del alias de correo electrónico, p. Ej. 'trabajos' si desea " +"recibir correos electrónicos para " + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "¡El nombre del grupo debe ser único!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Este directorio necesita estar asociado a un registro." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Total elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Total archivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Total subcarpetas" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "Total archivos" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "Viaje" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Tipo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de actividad de excepción registrada." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Acceso de eliminación" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Desbloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "Desempaquetar correos electrónicos como" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Subir" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Archivo subido" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Sube tu primer archivo." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Usuario" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Usuarios" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Factura del proveedor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Mensajes del sitio web" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Histórico de mensajes del sitio web" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Acceso de escritura" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "Debe selecciona una carpeta primero" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "elemento(s)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe,msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "mail.catchall.domain" + +#~ msgid "Actions" +#~ msgstr "Acciones" + +#~ msgid "Views" +#~ msgstr "Vistas" diff --git a/dms/i18n/fa.po b/dms/i18n/fa.po new file mode 100644 index 000000000..ed86d052c --- /dev/null +++ b/dms/i18n/fa.po @@ -0,0 +1,2339 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-08-28 16:06+0000\n" +"Last-Translator: Mostafa Barmshory \n" +"Language-Team: none\n" +"Language: fa\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" نحوه پردازش ایمیل های دریافتی را مشخص کنید:\n" +"پرونده‌های منفرد: ایمیل به دایرکتوری پیوست می‌شود و \n" +"تمامی پیوست‌ها به شکل پرونده‌ها ایجاد شده‌اند. \n" +"\n" +"ساب‌دایرکتوری: یک ساب‌دایرکتوری جدید برای هر ایمیل ایجاد شده است.\n" +"و ایمیل به این ساب‌دایرکتوری پیوست شده است. پیوست‌ها \n" +"به شکل پرونده‌های ساب‌دایرکتوری‌ها ایجاد شده‌اند.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "%s (رونوشت)" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s پرونده‌ها" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s ساب‌دایرکتوری‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" +"\n" +"بایگانی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" +"\n" +"بایگانی نشده" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" +"\n" +"دانلود" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" +"\n" +" توجه نکاتی که باید پیش از جابه‌جایی پرونده‌های در نظر داشته باشید: " +"
\n" +"نمی‌توانید این تغییر را لغو کنید.
\n" +"به یاد داشته باشید که مجوزهای پرونده‌ها تحت تاثیر مجوزهای پوشه‌هایی است که آن " +"پرونده‌ها در آن قرار دارند، بنابراین، اگر آنها را تغییر دهید، ممکن است مجوزها " +"نیز تغییر کنند.
\n" +"این تغییر را با مسئولیت خودتان انجام دهید." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" +"\n" +"باز کنید" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" +"\n" +"پرونده‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" +"\n" +"دایرکتوری‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" +"\n" +"قفل" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" +"\n" +"ویرایش" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" +"\n" +"پاک کردن" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" +"\n" +"قفل‌گشایی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +"  " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +"@" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr " اقدامات
" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr " اسناد " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr " عملیات " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"یک فرهنگ لغت پایتون که ارزیابی می‌شود تا مقادیر پیش‌فرض هنگام ایجاد رکوردهای " +"جدید برای این نام مستعار ارائه کند." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "یک دایرکتوری نمی‌تواند خودش ریشه باشد و یک دایرکتوری والد دارد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "یک دایرکتوری باید حتما یک دایرکتوری والد داشته باشد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "یک دایرکتوری باید دارای مدل در ذخیره‌سازی پیوست باشد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "یک دایرکتوری با همین نام از قبل وجود دارد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "یک پرونده باید دارای مدل و شناسه منبع داده در محل ذخیره‌سازی باشد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "یک پرونده با نام مشابه از قبل در این دایرکتوری وجود دارد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "یک دایرکتوری ریسه باید یک محل ذخیره داشته باشد." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Misin انتزاعی سامانه مدیریت اسناد" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "ایمیل‌ها را از ... بپذیرید" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "گروه‌های دسترسی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "دسترسی به اطلاعات" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "هشدار دسترسی" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "حسابداری" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "اقدام لازم است" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "فعال" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "فعالیت‌ها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "نشانه‌گذاری بصری استثنا در فعالیت" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "وضعیت فعالیت" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "آیکون نوع فعالیت" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "یک دایرکتوری جدید اضافه کنید." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "یک پرونده جدید اضافه کنید." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "محتوای بیشتر اضافه کنید تا در ایمیل نشان داده شود" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "مدیر" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "نام مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "امنیت مخاطبان با نام مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "دامنه مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "نام دامنه مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "ایمیل مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "نام مستعار" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "تنظیمات مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "وضعیت نام مستعار" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "وضعیت نام مستعار بر اساس آخرین پیام دریافتی ارزیابی می‌شود." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "استخراج ایمیل نام مستعار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "مدل مستعار" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "همه" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "همه پرونده‌ها" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "یک خطا طی بارگذاری رخ داد" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "اپلیکیشن‌ها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "بایگانی شده" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "پرونده‌‎های بایگانی شده" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "آیا مطمئن هستید؟ همه فایل‌ها جابه‌جا خواهند شد." + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "پیوست" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "تعداد پیوست" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "پرونده پیوست" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "پایه" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "لغو کردن" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "دسته‌بندی‌ها" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "دسته‌بندی‌ها برای دسته‌بندی کردن اسناد به کار می‌روند." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "دسته‌بندی" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "نام این دسته‌بندی از قبل وجود داشت!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "کدکنترلی/SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "دسته‌بندی‌های زیرشاخه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "گروه‌های زیرشاخه" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "برای افزودن یک دایرکتوری جدید، کلیک کنید." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "برای افزودن یک پرونده جدید کلیک کنید." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "برای ایجاد یک تگ جدید کلیک کنید." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "بسته شده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "رنگ" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "شاخص رنگ" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "شرکت‌ها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "شرکت" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "گروه‌ها را کامل کنید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "اسامی را تکمیل کنید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "دایرکتوری‌ها را تکمیل کنید" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "تنظیمات پیکربندی" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "پیکربندی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "محتوا" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "محتوای باینری" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "پرونده محتوا" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "قرارداد" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "قراردادها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "دایرکتوری‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "عناصر را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "پرونده‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "عنوان پرونده‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "زیرمجموعه‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "زیرمجموعه‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "عنوان زیرمجموعه‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "تگ‌ها را بشمارید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "کاربران را بشمارید" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "ایجاد کردن" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "دسترسی ایجاد کنید" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "دایرکتوری ایجاد کنید" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "فضای ذخیره سازی ایجاد کنید" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "یک دسته‌بندی جدید ایجاد کنید." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "یک محل ذخیره‌سازی جدید ایجاد کنید." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "یک دایرکتوری ریشه جدید ایجاد کنید." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "یک شیء ذخیره‌سازی جدید ایجاد کنید." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "از پیوست‌های پیام یک پرونده ایجاد کنید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "ایجاد شده توسط" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "ایجاد شده بر" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "تاریخ ایجاد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "نوع ذخیره کنونی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "پیام برگشتی سفارشی" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "مشتری" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "فاکتور مشتری" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "نشانی اینترنتی پرتال مشتری" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "سامانه مدیریت اسناد" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mixin امنیت سامانه مدیریت اسناد" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "آیکون Mixin و تصویرکوچک سامانه مدیریت اسناد" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "پایگاه داده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "مقادیر پیش‌فرض" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "پسوندهای پرونده ممنوعه را تعریف کنید" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "حداکثر اندازه بارگذاری یک پرونده را به مگابایت تعریف کنید" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "یک فهرست از پسوندهای پرونده‌های ممنوعه را تعریف کنید. (مثال: 'exe,msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "حداکثر اندازه بارگذاری را به مگا بایت تعریف کنید. پیش‌فرض (25مگابایت)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "دسترسی را پاک کنید" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "دایرکتوری‌ها" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"می‌توانید از دایرکتوری‌ها برای ساختاربندی و سازمان‌دهی\n" +"پرونده‌ها در اودوو استفاده کنید." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "دایرکتوری" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "نام نمایش داده شده" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "دسته‌بندی سند" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "محل ذخیره‌سازی سند ایجاد شد!" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "تگ سند" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "اسناد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "وضعیت ورود به سیستم فهرست اسناد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "وضعیت ورود به سیستم پرونده اسناد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "وضعیت ورود به سیستم اسناد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "وضعیت ورود به سیستم ذخیره‌سازی اسناد" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "انجام شده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "ویرایشگر" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "عناصر" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "نام مستعار ایمیل" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "رشته ایمیل" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "دامنه ایمیل برای مثال 'example.com' در 'odoo@example.com'" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "خطا! شما نمی‌توانید دسته‌های تودرتو ایجاد کنید." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "شما نمی‌توانید دایرکتوری‌های تودرتو ایجاد کنید." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "کاربران صریح" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "پسوند" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "پسوندها" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "خارجی" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "پرونده" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "پسوندهای پرونده" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "ورود به سامانه پرونده‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "اندازه پرونده" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "بارگذاری پرونده" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "مدل کمکی پرونده استریم برای کنترلگرها" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "پرونده‌ها" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "پرونده‌ها برای ذخیره دایرکتوری محتوا در اودوو استفاده می‌شوند." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "سیستم ذخیره‌سازی پرونده" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "اولین پرونده بارگذاری شد!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "دنبال کنندگان" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "دنبال کنندگان (شرکاء)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "آیکون font awesome مانند fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "تنظیمات عمومی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "گروه" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "گروه‌بندی توسط" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "نام گروه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "کاربران گروه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "گروه‌ها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "پیامی دارد" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "منابع انسانی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "شناسه" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"شناسه رکورد والد که دارای نام مستعار است (به عنوان مثال: پروژه‌ای که حاوی نام " +"مستعار ایجاد وظیفه است)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "آیکون" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "نشانی اینترنتی آیکون" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "آیکونی برای نمایش یک فعالیت اسنثنایی." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"اگر یک پرونده را تنظیم کردید تا بایگانی شود در آن صورت آن پرونده نشان داده " +"نمی‌شود ولی همچنان وجود دارد." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" +"تیک را بزنید تا در زمان دریافت پیام جدید سیستم به شما اعلام کند و شما آنها " +"را بررسی کنید." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "تیک را بزنید تا پیام خطای تحویل پیام‌ها برایتان بیاید." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "تنظیم کنید تا دایرکتوری‌ها و پرونده‌ها فقط در دسترس شرکت منتخب باشد." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"تنظیم کنید تا این محتوا به جای پیام پیش‌فرض برای کاربران غیرمجاز به صورت " +"خودکار ارسال شود." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "تصویر" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "تصویر 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "تصویر 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "تصویر 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "تصویر 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" +"مشخص کنید که آیا دسترسی به دایرکتوری‌ها و پرونده‌ها تنها با دسترسی به مدل‌های " +"مربوطه کار می‌کند (برای مثال، اگر برخی دایرکتوری‌ها به فروش خاصی مرتبط باشند، " +"تنها کاربرانی که به آن فروش دسترسی خواندنی دارند، می‌توانند به این " +"دایرکتوری‌ها دسترسی پیدا کنند)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"مشخص کنید آیا دایرکتوری‌ها و پرونده‌ها به صورت خودکار فرآیند ایجاد ایمیل را " +"نیز ایجاد کنند" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "مشخص کنید آیا دایرکتوری‌ها و پرونده‌ها به صورت پیش‌فرض مخفی باشند." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"مشخص کنید آیا دایرکتوری یک دایرکتوری ریشه است.\n" +"یک دایرکتوری ریشه دارای یک شیء تنظیمات است، در حالی که یک دایرکتوری‌ با یک " +"مجموعه\n" +"والد، تنظیمات را از والد خود به ارث می‌برد." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "گروه‌های وارث" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "از رکورد مربوطه مجوزها را به ارث ببرید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "دسترسی ایجاد به ارث برده شده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "دسترسی به حذف به ارث رسیده شده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "دسترسی نگارش به ارث رسیده شده" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "داخلی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "داخلی/منابع انسانی" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "پیوست‌ها نامعتبر!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "فاکتورها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "دنبال کننده است" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "دایرکتوری ریشه است" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "امکان تغییر محل ذخیره سازی وجود ندارد." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "امکان تغییر یک ذخیره سازی والد با یک ذخیره سازی دیگر وجود ندارد." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "به تازگی انجام شده است" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "آخرین بار توسط ... به روزرسانی شده است" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "آخرین بار در ... به روزرسانی شده است" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "آخرین به روزرسانی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "لینک/پیوند" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "مدل‌های پیوندشده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "مدل پیوست‌های پیوندشده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "شناسه سابقه پیوست‌های پیوندشده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "تشخیص ورودی مبتنی بر بخش محلی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "قفل" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "قفل شده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "قفل شده توسط" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "مدیر/رئیس" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "انتقال دستی پرونده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "خطای تحویل پیام" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "پیام‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "اطلاعات متا" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "انتقال داده‌ها" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "انتقال پرونده %(index)s از %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "پرونده‌ها را انتقال دهید" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "انتقال" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "وضعیت انتقال" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "مدل" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "تاریخ اصلاح" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "جابه‌جایی" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "پرونده‌ها را جابه‌جا کنید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "ضرب الاجل فعالیت من" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "دایرکتوری‌های من" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "اسناد من" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "پرونده‌های من" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "نام" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "دایرکتوری ریشه جدید" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "محل ذخیره سازی جدید" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "اخبار" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "ضرب الاجل فعالیت بعدی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "خلاصه فعالیت بعدی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "نوع فعالیت بعدی" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "هیچ پیوستی ارائه نشده است" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "انجام نشده است" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "بدون نتایج" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "یادداشت" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "تعداد اقدامات" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "تعداد خطاها" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "تعداد پیام‌هایی که نیازمند اقدام هستند" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "تعداد پیام های دارای خطای تحویل" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +#, fuzzy +msgid "Onboarding" +msgstr "فرآیند ورود و ادغام" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +#, fuzzy +msgid "Onboarding Directory" +msgstr "دایرکتوری ورود و ادغام" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "پرونده ورود و ادغام" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +#, fuzzy +msgid "Onboarding Step" +msgstr "مرحله ورود و ادغام" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "ذخیره‌سازی ورود و ادغام" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "فقط فایل‌های موجود در همان دایرکتوری ریشه می‌توانند جابجا شوند." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "فقط مدیران می‌توانند این عمل را اجرا کنند." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +#, fuzzy +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"شناسه اختیاری یک موضوع (رکورد) که به آن همه پیام‌های ورودی متصل خواهند شد، " +"حتی اگر به آن پاسخ ندهند. اگر این تنظیم فعال شود، ایجاد رکوردهای جدید کاملاً " +"غیرفعال خواهد شد." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "سازماندهی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "دسته والد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "دایرکتوری والد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "گروه والد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "مدل والد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "مسیر والد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "شناسه موضوع رکورد والد" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +#, fuzzy +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "%(parent)sگروه والد \" فرزند \"%(current)s\" است." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"مدل والد دارای نام مستعار. مدلی که مرجع نام مستعار را نگه می دارد لزوماً مدلی " +"نیست که توسط alias_model_id (مثال: پروژه (parent_model) و task (model) ارائه " +"شده است))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "شریک" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "مسیرJson" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "نام‌های مسیر" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"خط مشی ارسال پیام در سند با استفاده ازدرگاه پستی.\n" +"- همه: همه می توانند پست کنند\n" +"- شرکا: فقط شرکای تأیید شده\n" +"- دنبال کنندگان: فقط دنبال کنندگان سند مرتبط یا اعضای کانال های زیر\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "پورتال" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +#, fuzzy +msgid "Portal Access URL" +msgstr "URL دسترسی به پورتال" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "پیش نمایش" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "محصول" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "پروژه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +#, fuzzy +msgid "Read Access" +msgstr "دسترسی را بخوانید" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "گیرندگان" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "گروه‌های دسترسی به رکورد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "رکورد ارجاع داده شد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "شناسه رشته رکورد" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "سند مرتبط" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "شناسه سند مرتبط" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "مدل سند مرتبط" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +#, fuzzy +msgid "Require Migration" +msgstr "نیاز به انتقال" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "کاربر مسئول" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#, fuzzy +msgid "Root Directories" +msgstr "دایرکتوری‌های ریشه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "دایرکتوری ریشه" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "دایرکتوری ریشه ایجاد شد!" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "فروش" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "نوع ذخیره‌سازی" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "اسکن" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "رمز امنیتی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "تنظیمات" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +#, fuzzy +msgid "Share" +msgstr "اشتراک گذاری" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "نمایش ذخیره‌سازی‌ها" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "پرونده های تکی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "اندازه" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +#, fuzzy +msgid "Size (human readable)" +msgstr "اندازه (قابل خواندن توسط انسان)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "علامت‌گذاری شده با ستاره" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "دایرکتوری‌های علامت‌گذاری شده با ستاره" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "ستاره‌ها" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"وضعیت بر اساس فعالیت ها\n" +"سررسید: تاریخ سررسید گذشته است\n" +"امروز: تاریخ فعالیت امروز است\n" +"برنامه ریزی شده: فعالیت های آینده." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "ذخیره‌سازی" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "ذخیره سازی پنهان است" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "فضاهای ذخیره‌سازی" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "فضاهای ذخیره‌سازی برای پیکربندی اسناد شما استفاده می‌شوند." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "زیرگروه‌ها" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "زیرپوشه‌ها" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "زیرپوشه" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "سیستم" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "برچسب" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "نام برچسب قبلاً وجود دارد!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "برچسب ها" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "برچسب‌ها برای دسته‌بندی اسناد استفاده می‌شوند." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "برچسب ها..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "اطلاعات فنی" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" +"فیلد فعال به شما این امکان را می‌دهد که دسته‌بندی را بدون حذف آن مخفی کنید." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "فیلد فعال به شما امکان می دهد برچسب را بدون حذف آن پنهان کنید." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "نام دایرکتوری نامعتبر است." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "پرونده دارای پسوند پرونده ممنوعه است." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "نام پرونده نامعتبر است." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "حداکثر اندازه آپلود %s مگابایت است." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"مدل (نوع سند در اودوو) که این آدرس معادل آن است. هر ایمیل ورودی که به رکورد " +"موجودی پاسخ ندهد، باعث ایجاد یک رکورد جدید از این مدل خواهد شد (برای مثال، " +"یک وظیفه پروژه)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"نام آدرس ایمیل معادل، مانند 'jobs' اگر می‌خواهید ایمیل‌ها را برای< " +"jobs@example.odoo.com > دریافت کنید" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "نام گروه باید منحصر به فرد باشد!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" +"نوع ذخیره برای تعیین نحوه ذخیره یک پرونده توسط سیستم استفاده می شود. اگر این " +"تنظیم را تغییر دهید، می‌توانید پرونده های موجود را به‌صورت دستی با راه‌اندازی " +"این عمل انتقال دهید." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "این دایرکتوری باید به یک رکورد مرتبط شود." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "تعداد کل عناصر" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "تعداد کل پرونده ها" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "تعداد کل زیرپوشه‌ها" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "تعداد کل پرونده ها" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "گردش" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "نوع" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "نوع فعالیت استثنایی روی رکورد." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "حذف پیوند دسترسی" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "باز کردن قفل" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "بازکردن ایمیل‌ها به عنوان" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "بارگذاری" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "بارگذاری پرونده" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "پرونده اول خود را بارگذاری کنید." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "کاربر" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "کاربران" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "فاکتور فروشنده" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "پیام‌های وب‌سایت" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "تاریخچه ارتباطات وب‌سایت" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "ویرایشگر جابجایی فایل‌های DMS" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "راهنمای به اشتراک‌گذاری رکوردهای سیستم مدیریت مستندات" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "دسترسی نوشتن" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "شما ابتدا باید یک دایرکتوری را انتخاب کنید" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "عناصر" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe،msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#, fuzzy +msgid "mail.catchall.domain" +msgstr "دامنه‌ای که ایمیل‌های بدون گیرنده خاص به آن ارسال می‌شود" + +#~ msgid "Actions" +#~ msgstr "اقدامات" + +#~ msgid "Views" +#~ msgstr "نماها" diff --git a/dms/i18n/fr.po b/dms/i18n/fr.po new file mode 100644 index 000000000..ecfa3ecbe --- /dev/null +++ b/dms/i18n/fr.po @@ -0,0 +1,2343 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-05-24 07:07+0000\n" +"PO-Revision-Date: 2024-08-14 09:14+0000\n" +"Last-Translator: tva-subteno-it \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Définit de quelle manière les emails sont traités :\n" +"\n" +" - Simple fichier : Cet email se retrouve lié au dossier et\n" +" toutes les pièces jointes sont créées comme des fichiers.\n" +"\n" +" - Sous-dossier : Un nouveau sous-dossier est créé pour " +"chaque email\n" +" et le mail est attaché à ce sous-dossier. Les pièces " +"jointes\n" +" sont créées en tant que fichiers du sous-dossier.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "%s (copie)" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Fichiers" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Sous-dossiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" +"\n" +" Archiver" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" +"\n" +" Désarchiver" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" +"\n" +" Télécharger" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" +"\n" +" ATTENTION: Conseils à garder à l'esprit avant de " +"déplacer des fichiers :
\n" +" - Ce changement ne peut pas être annulé.
\n" +" - N'oubliez pas que les autorisations des fichiers sont " +"celles du dossier qui les contient, il est donc possible que lorsque vous " +"les modifiez, les autorisations changent également.
\n" +" Faites ce changement à vos risques et périls." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" +"\n" +" Ouvrir" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" +"\n" +" Fichiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" +"\n" +" Dossiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" +"\n" +" Verrouiller" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" +"\n" +" Modifier" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" +"\n" +" Supprimer" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" +"\n" +" Déverrouiller" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +" @ " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "Actions" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Documents" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "Opérations" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Un dictionnaire Python qui sera évalué pour fournir des valeurs par défaut " +"lors de la création de nouveaux enregistrements pour cet alias." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "" +"Un répertoire ne peut pas être un répertoire racine et avoir un répertoire " +"parent." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Un répertoire doit avoir un répertoire parent." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" +"Un répertoire doit avoir un modèle dans le stockage des pièces jointes." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Un répertoire du même nom existe déjà." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" +"Un fichier doit avoir un modèle et un ID de ressource dans le stockage des " +"pièces jointes." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "Un fichier du même nom existe déjà dans ce répertoire." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Un répertoire racine doit avoir un stockage." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Mixin abstraite pour DMS" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Accepter les e-mails de" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Accès par groupes" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Informations d'accès" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Avertissement d'accès" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Comptabilité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Action nécessaire" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Actif" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Activités" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Décoration d'activité d'exception" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "État de l'activité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icône du Type d'Activité" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Ajouter un nouveau dossier." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Ajouter un nouveau fichier." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "Ajouter plus d'informations à afficher dans le mail" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "Administrateur" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "Alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Alias Contact Sécurité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "Alias de domaine" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "Alias domaine" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "Alias d'email" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Alias Nom" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Configuration d'Alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "Statut de l'alias" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "Statut de l'alias évalué sur le dernier message reçu." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Extraction-Alias-Email" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Modèle d'alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Tous" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Tous les fichiers" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Une erreur s'est produite pendant le téléchargement" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Applications" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "Archivé" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "Fichiers archivés" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "Êtes-vous sûr ? Tous les fichiers seront déplacés." + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Pièce jointe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Nombre de pièces jointes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "Fichier joint" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Base" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Annuler" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Catégories" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "Les catégories sont utilisées pour classer les documents." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Catégorie" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "Le nom de la catégorie existe déjà !" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "Checksum/SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Catégories Enfant" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Groupes Enfant" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Cliquez pour ajouter un nouveau répertoire." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Cliquez pour ajouter un nouveau fichier." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Cliquez pour ajouter une nouvelle étiquette." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Fermé" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Couleur" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Indice de couleur" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Sociétés" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Société" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Groupes Complet" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Nom complet" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Dossiers complets" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Configuration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Contenu" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Contenu binaire" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Contenu du Fichier" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Contrat" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Contrats" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "Nombre de dossiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "Nombre d'éléments" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "Nombre de fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "Nombre de titre de fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "Nombre de sous-catégories" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "Nombre de sous-dossiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "Nombre de titre de sous-dossiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "Nombre d'étiquettes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "Nombre d'utilisateurs" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Créer" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Autorisation de création" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Créer un répertoire" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Créer un stockage" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Créer une nouvelle catégorie." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Créer un nouveau stockage de documents." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Créer un nouveau répertoire racine." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Créez un nouvel objet de stockage." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Créer des fichiers à partir des pièces jointes des messages" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Date de création" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Type de sauvegarde actuel" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Message rejeté personnalisé" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Client" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Facture client" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "URL du portail client" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mixin de Sécurité DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "Mixin pour vignette et icône DMS" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Base de données" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Valeurs par défaut" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Définit les extensions de fichiers à exclure" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "Définit la taille maximale de téléchargement d'un fichier en Mo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "Définit les extensions de fichiers à exclure. (Exemple : 'exe, msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "Définir la taille maximale de téléchargement en Mo. Par défaut (25Mo)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Accès Suppression" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Dossiers" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Les répertoires peuvent être utilisés pour structurer et organiser\n" +" les fichiers directement dans Odoo." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Dossier" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Catégorie du document" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "Stockage de documents créé !" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Étiquette du document" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Documents" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "État du parcours d'intégration des dossiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "État du parcours d'intégration des fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "État du Parcours d'intégration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "État du parcours d'intégration du stockage documents" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Terminé" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "Éditeur" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Éléments" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "Alias de messagerie" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "Discussion par email" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "Domaine de messagerie par exemple 'example.com' dans 'odoo@exemple.com" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "Erreur ! Vous ne pouvez pas créer de catégories récursives." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "Erreur ! Vous ne pouvez pas créer de catégories récursives." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Utilisateurs explicites" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Extension" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Extensions" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Externe" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "Fichier" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "Extensions de fichiers" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "Parcours d'intégration des fichiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "Taille du fichier" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Téléversement de fichiers" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "Modèle d'aide au contrôleur - Streaming de fichier" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "Fichiers" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" +"Les fichiers sont utilisés pour enregistrer du contenu directement dans Odoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Stockage de fichiers" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "Premier fichier téléchargé !" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Abonnés" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Abonnés (Partenaires)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icône Font awesome ex : fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Réglages généraux" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Groupe" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Groupé par" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Nom du groupe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Utilisateurs du groupe" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Groupes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "A un message" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Ressource humaine" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "ID" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID de l'enregistrement parent contenant l'alias (exemple : projet contenant " +"l'alias de création de la tâche)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "Icône" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "URL de l'icône" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icône pour indiquer une activité d'exception." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Si un fichier est défini sur archivé, il n'est pas affiché, mais existe " +"toujours." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Si coché, les nouveaux messages nécessitent votre attention." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Si coché, certains messages ont une erreur de livraison." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"S'il est défini, les répertoires et les fichiers ne seront disponibles que " +"pour la société sélectionnée." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"S'il est défini, ce contenu sera automatiquement envoyé aux utilisateurs non " +"autorisés au lieu du message par défaut." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Image" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Image 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Image 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Image 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Image 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" +"Indiquez si l'accès aux répertoires et aux fichiers fonctionne uniquement " +"avec l'accès aux modèles associés (par exemple, si certains répertoires sont " +"liés à une vente, seuls les utilisateurs ayant un accès en lecture à ces " +"ventes peuvent y accéder)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Indique si les répertoires et les fichiers sont également créés " +"automatiquement dans le processus de composition du courrier" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "Indique si les répertoires et les fichiers sont masqués par défaut." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Indique si le répertoire est un répertoire racine.\n" +" Un répertoire racine a des paramètres, tandis qu'un répertoire avec " +"un parent défini\n" +" hérite des paramètres de son parent." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Hériter des groupes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Hériter les autorisation de l'enregistrement associé" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Accès Création hérité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Accès Suppression hérité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Accès Écriture hérité" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Interne" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Interne / Ressource Humaine" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "Pièces jointes non valides !" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Factures" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "Est abonné" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "Est un répertoire racine" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "Il n'est pas possible de modifier le stockage." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" +"Il n'est pas possible de changer vers un parent avec un autre stockage." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Fait à l'instant" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Dernière mise à jour" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "Lien" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Modèles liés" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Modèle de pièces jointes liées" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "ID d'enregistrement des pièces jointes liées" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "Détection entrante basée sur la partie locale" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Verrouiller" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Verrouillé" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Verrouillé par" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "Gestionnaire" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Migration manuelle de fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Erreur de livraison du message" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Messages" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Métadonnées" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migrer" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" +"Migration du fichier %(index)s de %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Migrer les fichiers" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "Migration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "État de la migration" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modèle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Date de modification" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "Déplacer" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "Déplacer les fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Date limite de mon activité" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Mes Dossiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "Mes Documents" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "Mes Fichiers" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "Nom" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Nouveau répertoire racine" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Nouveau stockage" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Actualités" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Date limite de la prochaine activité" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Résumé de l'activité suivante" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Type d'activité suivante" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "Aucune pièce jointe n'a été fournie" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "Non terminé" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Aucun résultats" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "Note" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Nombre d'actions" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Nombre d'erreurs" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Nombre de messages nécessitant une action" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Nombre de messages avec erreur de livraison" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "Parcours d'intégration" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "Parcours d'intégration des dossiers" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "Parcours d'intégration d'un fichier" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "Étape du parcours d'intégration" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "Parcours d'intégration pour le stockage" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "Seuls les fichiers du même répertoire racine peuvent être déplacés." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Seuls les gestionnaires peuvent exécuter cette action." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"ID facultatif d'un fil de discussion (enregistrement) auquel tous les " +"messages entrants seront attachés, même s'ils n'y ont pas répondu. S'il est " +"défini, cela désactivera complètement la création de nouveaux " +"enregistrements." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organiser" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Catégorie Parente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Dossier Parent" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Groupe Parent" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Modèle Parent" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Chemin Parent" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "ID de l'enregistrement du fil de discussion Parent" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "Le groupe parent '%(parent)s' est enfant de '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Modèle parent détenant l'alias. Le modèle contenant la référence d'alias " +"n'est pas nécessairement le modèle donné par alias_model_id (exemple : " +"projet (parent_model) et tâche (model))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "Partenaire" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Chemin Json" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "Noms des chemins" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Politique de publication d'un message sur le document à l'aide de la " +"passerelle de messagerie.\n" +"- tout le monde : tout le monde peut poster\n" +"- partenaires : uniquement des partenaires authentifiés\n" +"- abonnés (followers) : uniquement les abonnés du document concerné ou les " +"membres des canaux d'abonnement\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "Portail" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL d'accès au portail" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Aperçu" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Produit" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Projet" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Accès en lecture" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "Destinataires" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "Accès aux enregistrements des Groupes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Enregistrement référencé" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "ID de l'enregistrement du fil de discussion" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "Document lié" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "ID du document lié" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "Modèle du document lié" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Migration requise" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Utilisateur responsable" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Dossiers Racine" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "Répertoire Racine" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "Répertoire racine créé !" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Ventes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Type d'Enregistrement" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Scanner" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Jeton de Sécurité" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Réglages" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Partager" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Afficher les stockages" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "Fichiers uniques" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Taille" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "Taille (lisible)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Favoris" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Dossiers Favoris" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Favoris" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Statut basé sur les activités\n" +"En retard : la date d'échéance est déjà dépassée\n" +"Aujourd'hui : la date de l'activité est aujourd'hui\n" +"Prévu : Activités futures." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Stockage" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "Stockage est masqué" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Stockages" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Les stockages sont utilisés pour configurer vos documents." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Sous-catégories" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Sous-dossiers" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Sous-dossier" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "Système" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Étiquette" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "Le nom de l'étiquette existe déjà !" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Étiquettes" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "Les étiquettes sont utilisées pour catégoriser les documents." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Étiquettes..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Informations techniques" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "Le champ actif vous permet de masquer la catégorie sans la supprimer." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "Le champ actif vous permet de masquer l'étiquette sans la supprimer." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "Le nom du répertoire n'est pas valide." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "Le fichier a une extension de fichier interdite." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "Le nom du fichier n'est pas valide." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "La taille maximale de téléchargement est de %s Mo." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"Le modèle (Type de document Odoo) auquel cet alias correspond. Tout e-mail " +"entrant qui ne répond pas à un enregistrement existant entraînera la " +"création d'un nouvel enregistrement de ce modèle (par exemple, une tâche de " +"projet)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"Le nom de l'alias de messagerie, par ex. « jobs » si vous souhaitez recevoir " +"des e-mails pour " + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "Le nom du groupe doit être unique !" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" +"Le type de sauvegarde est utilisé pour déterminer comment un fichier est " +"sauvegardé par le système. Si vous modifiez ce paramètre, vous pouvez migrer " +"les fichiers existants en déclenchant l'action manuellement." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Ce répertoire doit être associé à un enregistrement." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Total d'éléments" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Total des fichiers" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Total des Sous-dossiers" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "Fichiers totaux" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "Voyages" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Type" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Type de l'activité d'exception enregistrée." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Autorisation de suppression" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Déverrouiller" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "Décompresser les e-mails en tant que" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Ajouter" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Ajouter un fichier" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Ajouter votre premier fichier." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Administrateur uniquement" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Utilisateurs" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Facture du fournisseur" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Messages du site Web" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Historique des communications du site Web" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "Wizard de déplacement de fichiers" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "Wizard pour partager des enregistrements" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Autorisation de modification" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "Vous devez d'abord sélectionner un dossier" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "élément(s)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe,msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "mail.catchall.domain" + +#~ msgid "Actions" +#~ msgstr "Actions" + +#~ msgid "Views" +#~ msgstr "Vues" diff --git a/dms/i18n/he_IL.po b/dms/i18n/he_IL.po new file mode 100644 index 000000000..696520eba --- /dev/null +++ b/dms/i18n/he_IL.po @@ -0,0 +1,2264 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-11-10 18:08+0000\n" +"Last-Translator: Yves Goldberg \n" +"Language-Team: none\n" +"Language: he_IL\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " +"n % 10 == 0) ? 2 : 3));\n" +"X-Generator: Weblate 3.10\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s קבצים" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"מילון פייתון שיוערך כדי לספק ערכי ברירת מחדל בעת יצירת רשומות חדשות לכינוי " +"זה." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "ספריה לא יכולה להיות ראשית אם יש לה ספריית אב." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "לספרייה צריכה להיות ספריה אב." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "כבר קיימת ספרייה עם אותו שם." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "קבל הודעות דוא\"ל מ" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "קבוצות גישה" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "הרשאות למידע" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "אזהרת גישה" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "נדרשת פעולה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "פעיל" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "פעילויות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "סימון פעילות חריגה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "מצב פעילות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "הוסף ספריה חדשה." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "הוסף קובץ חדש." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "כינוי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "כינוי אבטחת איש קשר" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "שם כינוי" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "הגדרת כינוי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "כינוי דואר-חילוץ" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "מודל בעל כינוי" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "הכל" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "כל הקבצים" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "בארכיון" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "קבצים בארכיון" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "כמות קבצים מצורפים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "בטל" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "קטגוריות" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "קטגוריות משמשות לסיווג מסמכים." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "קטגוריה" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "שם קטגוריה כבר קיים!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "תתי קטגוריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "קבוצת בן" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "לחץ כדי להוסיף ספריה חדשה." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "לחץ כדי להוסיף קובץ חדש." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "לחץ ליצירת תגית." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "סגור" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "צבע" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "אינדקס צבעים" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "חברות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "חברה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "קבוצות שלמות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "שם מלא" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "הגדרות תצורה" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "תצורה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "תוכן" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "תוכן הקובץ" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "ספירת ספריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "ספירת אלמנטים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "ספירת קבצים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "ספירת כותרות קבצים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "ספירת קטגוריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "ספירת תת-ספריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "ספירת כותרות תת-ספריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "ספירת תגיות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "צור" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "צור גישה" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "צור ספריה" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "צור מאגר" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "צור קטגוריה חדשה." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "צור מאגר מסמכים חדש." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "צור ספרייה ראשית חדשה." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "צור אובייקט אחסון חדש." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "נוצר על-ידי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "נוצר ב-" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "תאריך יצירה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "לקוח" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "כתובת פורטל לקוח" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "מסד נתונים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "ערכי ברירת מחדל" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "הגדר סיומות קבצים אסורות" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "מגדיר רשימה של סיומות קבצים אסורות. (דוגמה: 'exe, msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "מגדיר את גודל ההעלאה המרבי ב- MB. ברירת מחדל (25MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "מחק גישה" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "ספריות" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "ספריה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "שם תצוגה" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "קטגוריית מסמכים" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "תגית מסמך" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "מסמכים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "מדיניות ניהול שלבי ספריות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "מדיניות ניהול שלבי קבצים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "מדיניות ניהול שלבי מסמכים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "מדיניות ניהול שלבי ספריות" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "בוצע" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "עורך" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "אלמנטים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "כינוי דוא\"ל" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "שְׁגִיאָה! אינך יכול ליצור קטגוריות רקורסיביות." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "שְׁגִיאָה! אינך יכול ליצור ספריות רקורסיביות." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "משתמשים מפורשים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "סיומת" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "סוגי קבצים" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "קובץ" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "העלאת קובץ" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "קבצים" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "קבצים משמשים לשמירת תוכן ישירות בOdoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "מאגר" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "עוקבים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "עוקבים (לקוחות/ספקים)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "הגדרות כלליות" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "קבוצה" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "קבץ לפי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "שם הקבוצה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "קבוצות שלמות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "קבוצות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "מזהה" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"מזהה של רשומת האב המחזיקה בכינוי (דוגמה: פרויקט המחזיק בכינוי ליצירת המשימות)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "אייקון" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "סמל לציון פעילות חריגה." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "אם קובץ מוגדר לארכיון, הוא לא מוצג, אך עדיין קיים." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "אם מסומן, הודעות חדשות דורשות את תשומת לבך." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "אם מסומן, בחלק מההודעות קיימת שגיאת משלוח." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "אם מוגדר, ספריות וקבצים יהיו זמינים רק עבור החברה שנבחרה." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "מציין אם ספריות וקבצים מוסתרים כברירת מחדל." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "תורשת קבוצות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "פנימיים" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "משאבים פנימיים / אנושיים" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "חשבוניות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "עוקב" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "ספרייה ראשית" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "הרגע בוצע" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "עודכן לאחרונה על-ידי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "עדכון אחרון ב" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "עדכון אחרון" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "נעל" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "נעול" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "מנהל" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "העברת קבצים ידנית" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "הודעת שגיאת משלוח" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "הודעות" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "מטא מידע" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "העברת קבצים" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "תאריך שינוי" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "הספריות שלי" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "הקבצים שלי" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "הקבצים שלי" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "שם" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "ספרייה ראשית חדשה" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "שטח אחסון חדש" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "מועד אחרון לפעילות הבאה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "תיאור הפעילות הבאה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "סוג הפעילות הבאה" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "לא בוצע" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "לא תוצאות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "מספר הפעולות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "מספר השגיאות" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "מספר הודעות עם שגיאת משלוח" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "רק מנהלים יכולים לבצע פעולה זו." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"מזהה אפשרי של שרשור (רשומה) שאליו יצורפו כל ההודעות הנכנסות, גם אם לא השיבו " +"אליו. אם מוגדר, הדבר יבטל את יצירת הרשומות החדשות לחלוטין." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "מארגן" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "קטגוריית אם" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "ספריית אב" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "קבוצת אב" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "מודל אב" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "נתיב אב" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "מזהה רשומת אשכול אב" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"מודל אב המחזיק בכינוי. המודל המחזיק במזהה לכינוי אינו בהכרח המודל שניתן על " +"ידי alias_model_id (דוגמה: project (parent_model) ומשימה (model))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"מדיניות פרסום הודעה על המסמך באמצעות שער הדואר.\n" +"- כולם: כולם יכולים לפרסם\n" +"- לקוחות/ספקים: רק לקוחות/ספקים מאומתים\n" +"- עוקבים: רק עוקבים של המסמך הקשור או חברים בערוצים הבאים\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "פורטל" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "כתובת גישה לפורטל" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "מוצר" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "פרויקט" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "גישה לקריאה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "שיא קבוצות גישה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "מזהה רשומת אשכול" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "משתמש אחראי" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "ספרייה ראשית" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "אסימון אבטחה" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "הגדרות" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "שתף" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "הצג מאגרים" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "קבצים בודדים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "גודל" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "מסומן בכוכב" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "ספריות מכוכבות" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "כוכביות" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"סטטוס על בסיס פעילויות\n" +"איחור: תאריך היעד כבר חלף\n" +"היום: תאריך הפעילות הוא היום\n" +"מתוכנן: פעילויות עתידיות." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "אחסון" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "האחסון מוסתר" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "מחסני" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "אחסנים משמשים לתצורת המסמכים שלך." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "תת קטגוריה" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "תת-ספריות" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "תת-ספרייה" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "תגית" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "שם התגית כבר קיים!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "תגיות" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "תגיות משמשים לסיווג מסמכים." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "תגיות..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "מידע טכני" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "השדה הפעיל מאפשר לך להסתיר את הקטגוריה מבלי להסיר אותה." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "השדה הפעיל מאפשר להסתיר את התגית מבלי להסיר אותה." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "שם הספרייה אינו חוקי." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "לקובץ סיומת קבצים אסורה." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "שם הקובץ אינו חוקי." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "גודל ההעלאה המקסימלי הוא %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"המודל (סוג מסמך Odoo) שאליו הכינוי הזה תואם. כל דוא\"ל נכנס שלא יענה לרשומה " +"קיימת יביא ליצירת רשומה חדשה של מודל זה (למשל משימת פרויקט)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"שם כינוי הדוא\"ל, למשל 'עבודות' אם ברצונך לקבל הודעות דוא\"ל ל " + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "שם הקבוצה חייב להיות ייחודי!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "סה\"כ אלמנטים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "סה\"כ קבצים" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "סה\"כ תת-ספריות" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "סוג" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "סוג פעילות חריגה ברשומה." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "בטל את קישור הגישה" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "שחרר נעילה" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "חלק הודעות דוא\"ל כ-" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "טען קובץ" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "טען את הקובץ הראשון שלך." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "משתמש" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "משתמשים" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "הודעות מאתר האינטרנט" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "היסטורית התקשרויות מאתר האינטרנט" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "גישה לכתיבה" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "תחילה עליך לבחור ספריה" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "אלמנט(ים)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" + +#~ msgid "Actions" +#~ msgstr "פעולות" + +#~ msgid "Views" +#~ msgstr "תצוגות" diff --git a/dms/i18n/it.po b/dms/i18n/it.po new file mode 100644 index 000000000..23e1273cf --- /dev/null +++ b/dms/i18n/it.po @@ -0,0 +1,2339 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-21 13:27+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Definisci come sono elaborate le email in arrivo:\n" +"\n" +" - File singoli: l'email viene allegata alla directory e\n" +" tutti gli allegati sono creati come file.\n" +"\n" +" - Sottocategoria: viene creata una nuova sottocategoria per " +"ogni e-mail\n" +" e la posta è allegata a questa sottocategoria. Gli " +"allegati\n" +" sono creati come file della sottodirectory\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "%s (copia)" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Files" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Sottocategoria" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" +"\n" +" Archivia" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" +"\n" +" Riattiva" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" +"\n" +" Scarica" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" +"\n" +" ATTENZIONE: Cose da tenere presente prima di " +"muovere i file:
\n" +" - Questa modifica non può essere annullata.
\n" +" - Ricordarsi che i permessi dei file sono quelli della " +"cartella che li contiene, quindi, è possibile che quando viene modificata, " +"anche i permessi cambino.
\n" +" Eseguire queste modifiche a proprio rischio." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" +"\n" +" Apri" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" +"\n" +" File" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" +"\n" +" Cartelle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" +"\n" +" Blocca" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" +"\n" +" Modifica" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" +"\n" +" Elimina" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" +"\n" +" Sblocca" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" +"\n" +" &nbsp;" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" +"\n" +" &nbsp;" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "Cartelle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "File" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +" @ " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "Azioni" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Documenti" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "Operazioni" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "Viste" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Un dizionario Python che verrà valutato per fornire valori predefiniti " +"durante la creazione di nuovi record per questo alias." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "Una cartella non può essere radice e avere una cartella genitore." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Una cartella deve avere una cartella genitore." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "Una cartella deve avere un modello nello storage allegati." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Esiste già una cartella con lo stesso nome." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "Un file deve avere un modello e un ID risorsa nello storage allegati." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "Esiste già un file con lo stesso nome in questa cartella." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Una cartella radice deve avere uno storage." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Mixin DMS astratto" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Accetta email da" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Gruppi di accesso" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Informazioni di accesso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Avviso accesso" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Contabilità" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Azione richiesta" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Attiva" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Attività" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decorazione eccezione attività" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "Stato attività" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Icona tipo attività" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Aggiungi una nuova cartella." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Aggiungi un nuovo file." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "Aggiungi contenuto extra da visualizzare nella e-mail" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "Amministratore" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "Alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Alias contatto sicurezza" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "Dominio alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "Nome dominio alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "E-mail alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Nome alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Impostazioni alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "Stato alias" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "Stato alias valutato sull'ultimo messaggio ricevuto." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Estrazione-Email-Alias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Modello con alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Tutte" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Tutti i file" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Si è verificato un errore durante il caricamento" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Applicazioni" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "In archivio" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "File archiviati" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "Si è sicuri? Tutti i file verranno spostati." + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Allegato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Conteggio allegati" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "File allegato" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Base" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Annulla" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Categorie" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "Le categorie sono usate per classificare i documenti." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Categoria" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "Il nome della categoria esiste già!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "Checksum/SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Categorie figlie" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Gruppi figli" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Fare clic per aggiungere una nuova cartella." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Fare clic per aggiungere un nuovo file." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Fare clic per creare una nuova etichetta." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Chiuso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Colore" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Indice colore" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Aziende" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Azienda" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Gruppi completi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Nome completo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Cartelle complete" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Configurazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Contenuto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Contenuto binario" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Contenuto file" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Contratto" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Contratti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "Conteggio cartelle" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "Contggio elementi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "Conteggio file" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "Conteggio titoli dei file" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "Contggio sotto categorie" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "Conteggio sottocartelle" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "Conteggio titoli delle sottocartelle" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "Conteggio etichette" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "Contggio utenti" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Crea" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Accesso in creazione" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Crea cartella" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Crea storage" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Crea una nuova categoria." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Crea un nuovo storage documenti." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Crea una nuova cartella radice." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Crea un nuovo oggetto storage." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Crea file dagli allegati dei messaggi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Data creazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Tipo di salvataggio corrente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Messaggio personalizzato per il rifiuto" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Cliente" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Fattura cliente" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "URL portale cliente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mixin sicurezza DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "Anteprima e icona mixin DMS" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Database" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Valori predefiniti" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Definire le estensioni di file vietate" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "Definire la dimensione massina di caricamento in MB" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" +"Definisce un elenco di estensioni di file vietate. (Esempio: 'exe,msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" +"Definisce la dimensione massima di caricamento in MB. Predefinita (25MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Cancella accesso" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Cartelle" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Le cartelle possono essere usate per strutturare e organizzare\n" +" i file direttamente su Odoo." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Cartella" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "Campo percorso DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Categoria documento" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "Archivio documento creato!" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Etichetta documento" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Documenti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "Stato della cartella caricamento dei documenti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "Stato del file caricamento dei documenti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "Stato caricamento dei documenti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "Stato strage caricamento documenti" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Eseguito" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "Editor" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Elementi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "Alias email" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "Discussione e-mail" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "Dominio e-mail es 'example.com' in 'odoo@example.com'" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "Errore! Non è possibile creare categorie ricorsive." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "Errore! Non è possibile creare cartelle ricorsive." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Utenti espliciti" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Estensione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Estensioni" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Esterno" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "File" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "Estensioni file" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "Caricamento file" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "Dimensione file" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Carica file" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "Modello aiuto streaming file per controller" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "File" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" +"I file vengono utilizzati per salvare i contenuti direttamente in Odoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Filestore" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "Primo file caricato!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Seguito da" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguito da (partner)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Icona Font Awesome es. fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Impostazioni generali" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Gruppo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Nome gruppo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Utenti gruppo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Gruppi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "Ha un messaggio" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Risorse umane" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "ID" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID del record padre che contiene l'alias (esempio: progetto che contiene " +"l'alias di creazione dell'attività)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "Icona" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "URL icona" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Icona per indicare un'attività eccezione." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Se un file è impostato su archiviato, non viene visualizzato, ma esiste " +"ancora." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se selezionata, nuovi messaggi richiedono attenzione." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se selezionata, alcuni messaggi hanno un errore di consegna." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"Se impostato, cartelle e file saranno disponibili solo per l'azienda " +"selezionata." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"Se impostato, questo contenuto verrà inviato automaticamente agli utenti non " +"autorizzati invece del messaggio predefinito." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Immagine" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Immagine 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Immagine 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Immagine 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Immagine 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" +"Indica se l'accesso alle cartelle e ai file funziona solo con l'accesso al " +"modello correlato (ad esempio, se alcune cartelle sono collegate a un ordine " +"di vendita, solo gli utenti con accesso in lettura a questo ordine di " +"vendita possono accedervi)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Indica se le cartelle e i file vengono creati automaticamente anche nel " +"processo di composizione delle mail" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" +"Indica se le cartelle e i file sono nascosti per impostazione predefinita." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Indica se la cartella è una cartella radice.\n" +" Una cartella radice ha un oggetto impostazioni, mentre una cartella " +"con un\n" +" padre impostato eredita le impostazioni dal padre." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Eredita gruppi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Eredita le autorizzazioni dal record correlato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Accesso alla creazione ereditato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Accesso all'eliminazione ereditato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Accesso alla scrittura ereditato" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Interna" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Interno / Risorse umane" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "Allegato non valido!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Fatture" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "Segue" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "È una cartella radice" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "Non è possibile modificare lo storage." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "Non è possibile passare ad altro partner con un altro archivio." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Appena fatto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Ultimo aggiornamento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "Collegamento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Modelli collegati" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Modello degli allegati collegati" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "ID record degli allegati collegati" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "Rilevamento arrivo in base a parte-locale" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Blocco" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Bloccato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Bloccato da" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "Supervisore" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Migrazione manuale del file" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Errore di consegna messaggio" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Messaggi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Informazioni metadati" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migra" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "Migra il file %(index)s di %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Migra file" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "Migrazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "Stato migrazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modello" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Data di modifica" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "Movimento" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "Sposta file" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Scadenza mia attività" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Le mie cartelle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "I miei documenti" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "I miei file" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "Nome" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Nuova cartella radice" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Nuovo storage" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Novità" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Scadenza prossima attività" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Riepilogo prossima attività" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo prossima attività" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "Non è stato fornito l'allegato" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "Non completato" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Nessun risultato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "Nota" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Numero di azioni" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Numero di errori" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Numero di messaggi che richiedono un'azione" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Numero di messaggi con errore di consegna" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "Caricamento" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "Cartella caricamento" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "File caricamento" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "Passo caricamento" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "Archivio caricamento" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "Solo i file nella stessa cartella radice possono essere spostati." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Solo i responsabili possono eseguire questa azione." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"ID facoltativo di un thread (record) a cui verranno allegati tutti i " +"messaggi in arrivo, anche se non hanno risposto. Se impostato, disabiliterà " +"completamente la creazione di nuovi record." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organizzazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Categoria padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Cartella padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Gruppo padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Modello padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Percorso padre" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "ID record thread padre" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "Il gruppo padre '%(parent)s' è figlio di '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Modello padre che detiene l'alias. Il modello che contiene il riferimento " +"alias non è necessariamente il modello fornito da alias_model_id (esempio: " +"progetto (parent_model) e task (model))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "Partner" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Percorso Json" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "Nomi percorso" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Politica per inviare un messaggio sul documento utilizzando il mailgateway.\n" +"- chiunque: chiunque può inviare\n" +"- clienti: solo i clienti autenticati\n" +"- chi segue: solo chi segue il documento collegato o i membri dei seguenti " +"canali\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "Portale" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL accesso portale" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Anteprima" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "Anteprima record" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Prodotto" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Progetto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Accesso in lettura" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "Destinatari" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "Gruppi di accesso al record" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Record referenziato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "ID thread record" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "Documento correlato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "ID documento correlato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "Modello documento correlato" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Richiede migrazione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Utente responsabile" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Cartelle radice" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "Cartella radice" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "Cartella radice creata!" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Vendite" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Tipo salvataggio" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Leggi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Token di sicurezza" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Impostazioni" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Condividi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Mostra storage" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "File singoli" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Dimensione" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "Dimensione (leggibile)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Preferiti" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Cartelle preferite" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Asterischi" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Stato in base alle attività\n" +"Scaduto: la data richiesta è trascorsa\n" +"Oggi: la data attività è oggi\n" +"Pianificato: attività future." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Deposito" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "Lo storage è nascosto" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Storage" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Gli storage sono usati per organizzare i tuoi documenti." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Sottocategorie" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Sottocartelle" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Sottocartella" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "Sistema" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Etichetta" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "Il nome dell'etichetta esiste già!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Etichette" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "Le etichette sono usate per classificare i documenti." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Etichette..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Informazioni tecniche" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "Il campo attivo permette di nascondere la categoria senza rimuoverla." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "Il campo attivo permette di nascondere l'etichetta senza rimuoverla." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "Il nome della cartella non è valido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "Il file ha un'estensione vietata." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "Il nome del file non è valido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "La dimensione massima di upload è %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"Il modello (tipo documento Odoo) a cui corrisponde questo alias. Qualsiasi e-" +"mail in arrivo che non risponde a un record esistente causerà la creazione " +"di un nuovo record di questo modello (es. un task progetto)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"Il nome dell'alias email, ad es. 'lavori' se vuoi ricevere email per " +"" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "Il nome del gruppo deve essere unico!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" +"Il tipo di salvataggio viene utilizzato per determinare come un file viene " +"salvato dal sistema. Se si modifica questa impostazione, si può eseguire la " +"migrazione dei file esistenti manualmente attivando l'azione." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Questa cartella deve essere associata a un record." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Totale elementi" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Totale file" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Totale sottocartelle" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "Totale file" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "In viaggio" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Tipo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo di attività eccezione sul record." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Accesso in eliminazione" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Sblocca" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "Decomprimi le email come" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Carica" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Carica file" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Carica il tuo primo file." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Utente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Utenti" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Fattura fornitore" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Messaggi sito web" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Cronologia comunicazioni sito web" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "Procedura guidata sposta file DMS" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "Procedura guidata per condividere i record DMS" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Accesso in scrittura" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "È necessario prima selezionare una cartella" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "elemento(i)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe,msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "mail.catchall.domain" + +#~ msgid "Actions" +#~ msgstr "Azioni" + +#~ msgid "Views" +#~ msgstr "Viste" diff --git a/dms/i18n/nl.po b/dms/i18n/nl.po new file mode 100644 index 000000000..766a07e57 --- /dev/null +++ b/dms/i18n/nl.po @@ -0,0 +1,2238 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-12-13 03:55+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 3.10\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Bestanden" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Submappen" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" diff --git a/dms/i18n/pt.po b/dms/i18n/pt.po new file mode 100644 index 000000000..79b2eedad --- /dev/null +++ b/dms/i18n/pt.po @@ -0,0 +1,2298 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-02-29 21:34+0000\n" +"Last-Translator: Peter Romão \n" +"Language-Team: none\n" +"Language: pt\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Defina como os e-mails recebidos são processados:\n" +"\n" +" - Arquivos Singulares: O e-mail é anexado à diretoria e\n" +" todos os anexos são criados como arquivos.\n" +"\n" +" - Subdiretoria: Um novo subdiretoria é criado para cada e-" +"mail\n" +" e o e-mail está anexado a este subdiretoria. Os anexos\n" +" são criados como arquivos do subdiretoria.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Arquivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Subdiretorias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +" @ " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Um dicionário de Python que será avaliado para fornecer valores predefinidos " +"ao criar novos registos para este pseudónimo." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "Uma diretoria não pode ser uma raiz e ter uma diretoria ascendente." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Uma diretoria precisa de ter uma diretoria ascendente." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "Uma diretoria precisa de ter um modelo no armazenamento por anexos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Já existe uma diretoria com o mesmo nome." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" +"Um arquivo deve ter ID de modelo e de recurso no armazenamento por anexos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Uma diretoria raiz precisa ter um armazenamento." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Mixin Dms Abstrato" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Aceite E-mails de" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Grupos de Acesso" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Informação de Acesso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Aviso de acesso" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Contabilidade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Acção Necessária" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Ativo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Atividades" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoração de Atividade Excepcional" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "Estado da Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Ícone do Tipo de Atividade" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Adicione uma nova Diretoria." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Adicione um novo Arquivo." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "Admin" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "Pseudônimo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Segurança de Contacto do Psudónimo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Nome do Pseudónimo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Configuração do Pseudónimo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Alias-Mail-Extraction" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Modelo c/ Pseudónimo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Todos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Todos os Arquivos" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Ocorreu um erro durante o upload" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Aplicações" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "Arquivado" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "Arquivos Arquivados" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Anexo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Número de Anexos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "Arquivo em Anexo" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Base" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Categorias" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "As categorias são usadas para categorizar documentos." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Categoria" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "Nome da categoria já existe!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "Checksum/SHA1" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Categorias Descendentes" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Grupos Descendentes" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Clique para adicionar uma nova diretoria." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Clique para adicionar um novo arquivo." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Clique pra criar uma nova etiqueta." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Fechado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Cor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Índice de Cores" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Empresa" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Grupos Completos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Nome Completo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Diretorias completas" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Ajuste de Configurações" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Configuração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Conteúdo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Conteúdo Binário" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Conteúdo Arquivo" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Contrato" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Contratos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "Contagem de Diretorias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "Contagem de Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "Contagem de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "Contagem de Títulos de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "Contagem de Subcategorias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "Contagem de Subdiretorias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "Contagem de Título de Subdiretorias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "Contagem de Etiquetas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "Contagem de Utilizadores" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Criar" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Acesso à Criação" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Criar Diretoria" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Criar Armazenamento" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Criar uma nova Categoria." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Criar um novo Armazenamento de Documentos." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Criar uma nova Diretoria Raiz." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Criar um novo objeto de Armazenamento." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Criar arquivos a partir de anexos de mensagens" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Data de Criação" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Tipo de Salvaguarda Atual" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Mensagem Personalizada de E-mail Rejeitado" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Cliente" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Fatura do Cliente" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "URL do Portal do Cliente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mixin de Segurança DMS" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "Mixin de miniaturas DMS e ícones" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Base de Dados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Valores Predefinidos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Definir extensões de arquivo proibidas" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" +"Define uma lista de extensões de arquivo proibidas. (Exemplo: 'exe,msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "Define o tamanho máximo de carregamento em MB. Padrão (25MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Eliminar Acesso" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Diretorias" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Diretorias podem ser usadas para estruturar e organizar\n" +" arquivos diretamente em Odoo." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Diretoria" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Nome" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Categoria do Documento" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Etiqueta de Documento" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "Estado da Diretoria de Documentos de Integração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "Estado do Arquivo de Documentos de Integração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "Estado de Documentos de Integração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "Estado de Armazenamento de Documentos de Integração" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Feito" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "Editor" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "Pseudónimo de E-mail" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "Fio de Comunicação E-mail" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "Erro! Não é possível criar categorias recursivas." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "Erro! Não é possível criar diretorias recursivas." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Utilizadores Explícitos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Extensão" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Extensões" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Externo" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "Arquivo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Carregamento de Arquivo" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "Arquivos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "Os arquivos são usados para guardar conteúdo diretamente no Odoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Filestore" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Parceiros)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Ícone do fonte awesome ex. fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Configurações Gerais" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Grupo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Nome do Grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Utilizadores do Grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Grupos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "Tem Mensagem" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Recursos Humanos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "ID" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID do registo ascendente que armazena o pseudónimo (Ex.: projeto que " +"armazena o pseudónimo de criação de tarefas)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "Ícone" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "URL do Icone" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Ícone para indicar uma exceção na atividade." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Se um arquivo for definido como arquivado, ele não será exibido, mas ele " +"ainda existe." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se estiver marcado, tem novas mensagens que requerem a sua atenção." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se estiver marcado, algumas mensagens têm um erro na entrega." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"Se definido, diretorias e arquivos só estarão disponíveis para a empresa " +"selecionada." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"Se definido, será este o conteúdo a ser enviado automaticamente para " +"utilizadores não autorizados em vez da mensagem predefinida." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Imagem" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Imagem 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Imagem 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Imagem 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Imagem 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Indique se as diretorias e arquivos também são criados automaticamente no " +"processo de composição de e-mail" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "Indica se as diretorias e arquivos estão ocultos por predefinição." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Indica se a diretoria é um diretoria raiz.\n" +" Um diretoria raiz tem um objeto para configurações, enquanto uma " +"diretoria com um\n" +" ascendente definido herda as configurações do seu ascendente." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Herdar Grupos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Herdar permissões desde registo vinculado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Acesso à Criação Herdado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Acesso à Desvinculação Herdado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Acesso à Gravação Herdado" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Interno" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Recursos Internos/Humanos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "Anexos inválidos!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Faturas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "É Seguidor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "É Diretoria Raiz" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "Não é possível alterar o armazenamento." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Concluído" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Última Atualização" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Modelos Vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Modelo de anexos vinculado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "Registro ID de Anexos vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Bloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Bloqueado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Bloqueado por" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "Gerente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Migração Manual de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Erro na Entrega de Mensagem" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Mensagens" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Meta Informação" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migrar" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" +"Migrar arquivo %(index)s de %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Migrar Arquivos" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "Estado da Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modelo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Data de modificação" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Prazo da Minha Atividade" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Minhas Diretorias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "Meus Documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "Meus Arquivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "Nome" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Nova Diretoria Raiz" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Novo Armazenamento" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Notícias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Prazo da Próxima Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Resumo da Próxima Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo da Atividade Seguinte" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "Não foi fornecido nenhum anexo" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "Não Feito" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Não são resultados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de Ações" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Número de erros" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensagens que requerem acção" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensagens com um erro de entrega" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Somente os gerentes podem executar essa ação." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"ID opcional de um fio de comunicação (registro) ao qual todas as mensagens " +"recebidas serão anexadas, mesmo que não lhe tenham respondido. Se definido, " +"isto desabilitará completamente a criação de novos registros." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organizando" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Categoria Ascendente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Diretoria Ascendente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Grupo Ascendente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Modelo Ascendente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Caminho Ascendente" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "ID do Fio de Comunicação de Registo Ascendente" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "O grupo ascendente '%(parent)s' é descendente de '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Modelo ascendente que armazena o pseudónimo. O modelo que armazena a " +"referência ao pseudónimo não é necessariamente o modelo determinado por " +"alias_model_id (Ex.: project (parent_model) e task (model))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "Parceiro" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Caminho JSON" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "Nomes de Caminho" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Política para enviar uma mensagem sobre o documento usando o MailGateway.\n" +"- todos: Qualquer um pode escrever\n" +"- parceiros: somente parceiros autenticados\n" +"- seguidores: apenas seguidores do documento relacionado ou membros dos " +"seguintes grupos\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "Portal" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL de Acesso ao Portal" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Pré-visualização" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Artigo" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Projeto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Acesso de Leitura" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "Gravar Grupos de Acesso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Registo Referenciado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "ID do Fio de Registro" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Requer Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Utilizador Responsável" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Diretorias Raiz" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "Diretoria Raiz" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Vendas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Tipo de Salvaguarda" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Analisar" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Token de segurança" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Configurações" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Partilhar" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Mostrar armazenamentos" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "Arquivos Singulares" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Tamanho" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Favorito" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Diretorias Favoritas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Estrelas" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Estados baseados nas atividades\n" +"Vencida: Ultrapassada a data planeada\n" +"Hoje: Data da atividade é a de hoje\n" +"Planeada: Atividades futuras." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Armazenamento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "O Armazenamento está Oculto" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Armazenamentos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Os armazenamentos são usados para configurar os seus Documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Subcategorias" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Subdiretorias" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Subdiretoria" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "Sistema" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Etiqueta" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "Já existe uma etiqueta com este nome!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Etiquetas" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "As etiquetas são usadas para categorizar documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Etiquetas..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Informação Técnica" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "O campo ativo permite que oculte a categoria sem a remover." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "O campo ativo permite que oculte a etiqueta sem a remover." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "O nome da diretoria é inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "O arquivo tem uma extensão de arquivo proibida." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "O nome do arquivo é inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "O tamanho máximo de upload é %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"O modelo (Odoo Document Kind) ao qual este pseudónimo corresponde. Qualquer " +"e-mail de entrada que não responda a um registo existente criará um novo " +"registo deste modelo (Ex.: uma Tarefa de Projeto)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"O nome do pseudónimo de e-mail, ex.: 'jobs' se quiser receber emails de " +"" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "O nome do grupo deve ser único!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Esta diretoria precisa de ser associada a um registo." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Total de Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Total de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Total de Subdiretorias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "Viajando" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Tipo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de atividade de exceção registada." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Acesso à Desvinculação" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Desbloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "Desempacotar e-mails como" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Carregar" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Carregar Arquivo" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Carregue o seu primeiro Arquivo." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Utilizador" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Utilizadores" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Fatura de Fornecedor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Mensagens do Website" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Histórico de comunicação do website" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Acesso à Gravação" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "Deve selecionar uma diretoria primeiro" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "elementos(s)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe,msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "mail.catchall.domínio" + +#~ msgid "Actions" +#~ msgstr "Ações" + +#~ msgid "Views" +#~ msgstr "Visualizações" diff --git a/dms/i18n/pt_BR.po b/dms/i18n/pt_BR.po new file mode 100644 index 000000000..0ab454fe7 --- /dev/null +++ b/dms/i18n/pt_BR.po @@ -0,0 +1,2297 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-05 17:34+0000\n" +"Last-Translator: Adriano Prado \n" +"Language-Team: none\n" +"Language: pt_BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" +" Defina como os e-mails recebidos são processados:\n" +"\n" +" - Arquivos únicos: o e-mail é anexado ao diretório e\n" +" todos os anexos são criados como arquivos.\n" +"\n" +" - Subdiretório: Um novo subdiretório é criado para cada " +"email\n" +" e o email é anexado a este subdiretório. Os anexos\n" +" são criados como arquivos do subdiretório.\n" +" " + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "%s Arquivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "%s Sub-diretórios" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" +"@\n" +" @ " + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" +"Um dicionário Python que será avaliado para fornecer valores padrão ao criar " +"novos registros para este alias." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "Um diretório não pode ser raiz e ter um diretório superior." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "Um diretório deve ter um diretório superior." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "Um diretório deve ter modelo no armazenamento de anexos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "Já existe um diretório com o mesmo nome." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "Um arquivo deve ter modelo e ID de recurso no armazenamento de anexos." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "Um diretório raiz precisa ter um armazenamento." + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "Mixin Sgd abstrato" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "Aceitar e-mails de" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "Grupos de Acesso" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "Informações de Acesso" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "Aviso de acesso" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "Contabilidade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "Ação Necessária" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "Ativo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "Atividades" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "Decoração de exceção de atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "Situação da Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "Ícone Tipo Atividade" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "Add um novo Diretório." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "Add um novo Arquivo." + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "Admin" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "Apelido" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "Apelido Contato Segurança" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "Nome Alternativo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "Configuração Apelido" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "Extração de Alias-Mail" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "Modelo com alias" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "Tudo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "Todos os Arquivos" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "Ocorreu um erro durante o carregamento" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "Apps" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "Arquivado" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "Arquivos Arquivados" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "Anexo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "Cont. Anexos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "Arquivo Anexado" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "Base" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "Cancelar" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "Categorias" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "Categorias são usadas para categorizar documentos." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "Categoria" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "O nome da categoria já existe!" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "Categorias Inferiores" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "Grupos Inferiores" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "Clique para adicionar um novo diretório." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "Clique para adicionar um novo arquivo." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "Clique para criar uma novo marcador." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "Fechado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "Cor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "Índice Cores" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "Empresas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "Empresa" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "Grupos completos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "Nome completo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "Diretórios completos" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "Configurações" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "Configuração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "Conteúdo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "Conteúdo Binário" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "Arquivo de conteúdo" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "Contrato" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "Contratos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "# Diretórios" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "# Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "# Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "# Título dos Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "# Subcategorias" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "# Subdiretórios" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "# Título dos Subdiretórios" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "# Marcadores" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "# Usuários" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "Criar" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "Permissão de Criação" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "Criar Diretório" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "Criar Armazenamento" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "Criar uma nova Categoria." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "Crie um novo Armazenamento de Documentos." + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "Crie um novo diretório raiz." + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "Crie um novo objeto de Armazenamento." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "Crie arquivos a partir de anexos de mensagens" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "Criado por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "Criado em" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "Data Criação" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "Tipo de Salvamento Atual" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "Mensagem Devolvida Personalizada" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "Cliente" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "Fatura Cliente" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "URL do Portal do Cliente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "SGD" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "Mixin de segurança SGD" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "Banco de Dados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "Valores Padrão" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "Defina extensões de arquivo proibidas" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" +"Define uma lista de extensões de arquivo proibidas. (Exemplo: 'exe,msi')" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "Define o tamanho máximo de upload em MB. Padrão (25 MB)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "Permissão de Exclusão" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "Diretórios" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" +"Os diretórios podem ser usados para estruturar e organizar\n" +" arquivos diretamente no Odoo." + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "Diretório" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "Nome Exibição" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "Categoria Documento" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "Marcador Documento" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "Estado do Diretório de Integração de Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "Estado do Arquivo de Integração de Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "Estado da Integração de Documentos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "Estado de Armazenamento da Integração de Documentos" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "Feito" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "Editor" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "Apelido de E-mail" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "Tópico do e-mail" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "Erro! Você não pode criar categorias recursivas." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "Erro! Você não pode criar diretórios recursivos." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "Usuários Explícitos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "Extensão" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "Extensões" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "Externo" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "Arquivo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "Carregamento de Arquivo" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "Arquivos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "Arquivos são usados para salvar conteúdo diretamente no Odoo." + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "Armazenamento de Arquivos" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "Seguidores" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "Seguidores (Parceiros)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "Ícone da Fonte awesome e.x. fa-tasks" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "Configurações Gerais" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "Grupo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "Agrupar Por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "Nome do Grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "Usuários do Grupo" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "Grupos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "Tem Menssagem" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "Recursos Humanos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "ID" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" +"ID do registro superior que contém o alias (exemplo: projeto que contém o " +"alias de criação da tarefa)" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "Ícone" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "Ícone URL" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "Ícone para indicar uma atividade de exceção." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" +"Se um arquivo estiver definido como arquivado, ele não será exibido, mas " +"ainda existirá." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "Se marcada, novas mensagens requerem sua atenção." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "Se marcada, algumas mensagens apresentam um erro de entrega." + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" +"Se definido, os diretórios e arquivos estarão disponíveis apenas para a " +"empresa selecionada." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" +"Se definido, esse conteúdo será enviado automaticamente para usuários não " +"autorizados, em vez da mensagem padrão." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "Imagem" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "Imagem 1024" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "Imagem 128" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "Imagem 256" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "Imagem 512" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" +"Indica se diretórios e arquivos também são criados automaticamente no " +"processo de composição de mensagens" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "Indica se diretórios e arquivos estão ocultos por padrão." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" +"Indica se o diretório é um diretório raiz.\n" +" Um diretório raiz possui um objeto de configurações, enquanto um " +"diretório setado com\n" +" pai herda as configurações de seu pai." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "Herdar Grupos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "Herdar permissões do registro relacionado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "Permissão de Criação Herdada" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "Acesso de Desvinculação Herdado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "Permissão de Escrita Herdada" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "Interno" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "Interno/Recursos Humanos" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "Anexos Inválidos!" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "Faturas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "É Seguidor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "É Diretório Raiz" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "Não é possível alterar o armazenamento." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "Concluído" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "Última Atualização por" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "Última Atualização em" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "Última Atualização" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "Modelos Vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "Modelo de anexos vinculados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "Anexo Vinculado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "Bloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "Bloqueado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "Bloqueado por" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "Gerente" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "Migração Manual de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "Erro na entrega de mensagens" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "Mensagens" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "Meta Informação" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "Migrar" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" +"Migrar arquivo %(index)s de %(record_count)s [ %(dms_file_migration)s ]" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "Migrar Arquivos" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "Status da Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "Modelo" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "Data Modificação" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "Prazo da minha Atividade" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "Meus Diretórios" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "Meus Documentos" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "Meus Arquivos" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "Nome" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "Novo Diretório Raiz" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "Novo Armazenamento" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "Novos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "Prazo para Próxima Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "Resumo da Próxima Atividade" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "Tipo da Próxima Atividade" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "Nenhum anexo foi fornecido" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "Não realizado" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "Sem Resultados" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "Número de Ações" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "Número de erros" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "Número de mensagens que exigem ação" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "Número de mensagens com erro de entrega" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "Somente os gerentes podem executar esta ação." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" +"ID opcional de um tópico (registro) ao qual todas as mensagens recebidas " +"serão anexadas, mesmo que não tenham respondido. Se definido, isso " +"desabilitará completamente a criação de novos registros." + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "Organizando" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "Categoria Superior" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Diretório Superior" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "Grupo Superior" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "Modelo Superior" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "Caminho Superior" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "ID do tópico do registro superior" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "O grupo superior '%(parent)s' é filho de '%(current)s'." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" +"Modelo pai que contém o alias. O modelo que contém a referência de alias não " +"é necessariamente o modelo fornecido por alias_model_id (exemplo: projeto " +"(modelo_pai) e tarefa (modelo))" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "Parceiro" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "Caminho Json" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" +"Política para postar uma mensagem no documento usando o mailgateway.\n" +"- todos: todos podem postar\n" +"- parceiros: apenas parceiros autenticados\n" +"- seguidores: apenas seguidores do documento relacionado ou membros dos " +"canais seguintes\n" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "Portal" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "URL do Portal de Acesso" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "Visualização" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "Produto" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "Projeto" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "Permissão de Leitura" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "Registro Referenciado" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "Requer Migração" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "Usuário Responsável" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "Diretórios Raiz" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "Vendas" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "Salvar Como" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "Procurar" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "Token de Segurança" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "Configurações" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "Compartilhar" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "Mostrar armazenamentos" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "Arquivos Únicos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "Tamanho" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "Favorito" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "Diretórios Favoritos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "Favoritos" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" +"Status baseado em atividades\n" +"Atrasado: a data de vencimento já passou\n" +"Hoje: a data da atividade é hoje\n" +"Planejado: Atividades futuras." + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "Armazenamento" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "Armazenamento está Oculto" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "Armazenamentos" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "Os armazenamentos são usados para configurar seus Documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "Subcategorias" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "Subdiretórios" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "Subdiretório" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "Sistema" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "Marcador" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "O nome do marcador já existe!" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "Marcadores" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "Marcadores são usadas para categorizar documentos." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "Marcadores..." + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "Informação Técnica" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "O campo ativo permite ocultar a categoria sem removê-la." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "O campo ativo permite ocultar o marcador sem removê-lo." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "O nome do diretório é inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "O arquivo tem uma extensão proibida." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "O nome do arquivo é inválido." + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "O tamanho máximo de upload é %s MB." + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" +"O modelo (Tipo de Documento Odoo) ao qual este alias corresponde. Qualquer e-" +"mail recebido que não responda a um registro existente causará a criação de " +"um novo registro deste modelo (por exemplo, uma Tarefa de Projeto)" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" +"O nome do alias de e-mail, por ex. 'empregos' se você quiser receber e-mails " +"para " + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "O nome do grupo deve ser único!" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "Este diretório precisa estar associado a um registro." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "Total de Elementos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "Total de Arquivos" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "Total de Subdiretórios" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "Viajando" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "Tipo" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "Tipo de atividade de exceção registrada." + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "Desvincular Permissão" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "Desbloquear" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "Descompacte e-mails como" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "Carregar" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "Carregar Arquivo" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "Carregue seu primeiro arquivo." + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "Usuário" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "Usuários" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "Fatura Fornecedor" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "Mensagens do Site" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "Histórico de comunicação do Site" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "Permissão de Gravação" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "Você deve selecionar um diretório primeiro" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "elemento(s)" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "exe,msi" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" + +#~ msgid "Actions" +#~ msgstr "Ações" + +#~ msgid "Views" +#~ msgstr "Visualizações" diff --git a/dms/i18n/ru.po b/dms/i18n/ru.po new file mode 100644 index 000000000..4fc241bf0 --- /dev/null +++ b/dms/i18n/ru.po @@ -0,0 +1,2237 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " +"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory " +"and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each " +"email\n" +" and the mail is attached to this subdirectory. The " +"attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving " +"files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those " +"of the folder that contains it, therefore, it is possible that when you " +"change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task " +"creation alias)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access " +"(for example, if some directories are related with any sale, only users with " +"read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process too" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a " +"set\n" +" parent inherits the settings form its parent." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not " +"necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following " +"channels\n" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming " +"email that does not reply to an existing record will cause the creation of a " +"new record of this model (e.g. a Project Task)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you " +"change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" diff --git a/dms/i18n/sv.po b/dms/i18n/sv.po new file mode 100644 index 000000000..b6027afab --- /dev/null +++ b/dms/i18n/sv.po @@ -0,0 +1,2228 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_process +msgid "" +" Define how incoming emails are processed:\n" +"\n" +" - Single Files: The email gets attached to the directory and\n" +" all attachments are created as files.\n" +"\n" +" - Subdirectory: A new subdirectory is created for each email\n" +" and the mail is attached to this subdirectory. The attachments\n" +" are created as files of the subdirectory.\n" +" " +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "%s (copy)" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "%s Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Archive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unarchive" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Download" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "" +"\n" +" ATTENTION: Tips to keep in mind before moving files:
\n" +" - This change cannot be undone.
\n" +" - Remember that the permissions of the files are those of the folder that contains it, therefore, it is possible that when you change it, the permissions will also change.
\n" +" Make this change at your own risk." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Open" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Lock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Edit" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_kanban +msgid "" +"\n" +" Delete" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "" +"\n" +" Unlock" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "" +"\n" +" &nbsp;" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "" +"@\n" +" @ " +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Actions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Operations" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Views" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_defaults +msgid "" +"A Python dictionary that will be evaluated to provide default values when " +"creating new records for this alias." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory can't be a root and have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have a parent directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory has to have model in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A directory with the same name already exists." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file must have model and resource ID in attachment storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "A file with the same name already exists in this directory." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "A root directory has to have a storage." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_abstract_dms_mixin +msgid "Abstract Dms Mixin" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Accept Emails from" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_access_groups +#: model:ir.ui.menu,name:dms.menu_dms_access_groups +msgid "Access Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Access Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_warning +#: model:ir.model.fields,field_description:dms.field_dms_file__access_warning +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__access_warning +msgid "Access warning" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_07_demo +msgid "Accounting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction +msgid "Action Needed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__active +#: model:ir.model.fields,field_description:dms.field_dms_tag__active +msgid "Active" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_ids +msgid "Activities" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_decoration +msgid "Activity Exception Decoration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_state +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_state +msgid "Activity State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_icon +msgid "Activity Type Icon" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "Add a new Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +msgid "Add a new File." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_wizard_dms_share__note +msgid "Add extra content to display in the email" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_01_demo +msgid "Admin" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_id +msgid "Alias" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_contact +msgid "Alias Contact Security" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain_id +msgid "Alias Domain" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_domain +msgid "Alias Domain Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_full_name +msgid "Alias Email" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_name +msgid "Alias Name" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Alias Setting" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_status +msgid "Alias Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_status +msgid "Alias status assessed on the last message received." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Alias-Mail-Extraction" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_model_id +msgid "Aliased Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "All" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "All Files" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_06_demo +msgid "Apps" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__active +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Archived" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Archived Files" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Are you sure? All files will be moved." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_attachment +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__attachment +msgid "Attachment" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_attachment_count +#: model:ir.model.fields,field_description:dms.field_dms_file__message_attachment_count +msgid "Attachment Count" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__attachment_id +msgid "Attachment File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_base +msgid "Base" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Cancel" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_category +#: model:ir.ui.menu,name:dms.menu_dms_category +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Categories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Categories are used to categorize Documents." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__category_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__category_id +#: model:ir.model.fields,field_description:dms.field_dms_file__category_id +#: model:ir.model.fields,field_description:dms.field_dms_tag__category_id +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Category" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_category_name_uniq +msgid "Category name already exists!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__checksum +msgid "Checksum/SHA1" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__child_category_ids +msgid "Child Categories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__child_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Child Groups" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +msgid "Click to add a new directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Click to add a new file." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Click to create a new tag." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__closed +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__closed +msgid "Closed" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__color +#: model:ir.model.fields,field_description:dms.field_dms_directory__color +#: model:ir.model.fields,field_description:dms.field_dms_file__color +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Color" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_tag__color +msgid "Color Index" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_company +msgid "Companies" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__company_id +#: model:ir.model.fields,field_description:dms.field_dms_file__company_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__company_id +msgid "Company" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Complete Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__complete_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__complete_name +msgid "Complete Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__complete_directory_ids +msgid "Complete directories" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config +msgid "Configuration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content +msgid "Content" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_binary +msgid "Content Binary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__content_file +msgid "Content File" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_11_demo +msgid "Contract" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_03_demo +msgid "Contracts" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_category__count_directories +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_directories +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_directories +msgid "Count Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_elements +msgid "Count Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_files +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files_title +#: model:ir.model.fields,field_description:dms.field_dms_storage__count_storage_files +#: model:ir.model.fields,field_description:dms.field_dms_tag__count_files +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__count_files +msgid "Count Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_files +msgid "Count Files Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_categories +msgid "Count Subcategories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories_title +msgid "Count Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_directories +msgid "Count Subdirectories Title" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__count_tags +msgid "Count Tags" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__count_users +msgid "Count Users" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_new_form +msgid "Create" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_create +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_create +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_create +msgid "Create Access" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_create_directory +msgid "Create Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_document_storage +msgid "Create Storage" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_category +msgid "Create a new Category." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_document_storage +msgid "Create a new Document Storage." +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_create_directory +msgid "Create a new Root Directory." +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Create a new Storage object." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__include_message_attachments +msgid "Create files from message attachments" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_uid +msgid "Created by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__create_date +#: model:ir.model.fields,field_description:dms.field_dms_category__create_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__create_date +#: model:ir.model.fields,field_description:dms.field_dms_file__create_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__create_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__create_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__create_date +msgid "Created on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Creation Date" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__save_type +msgid "Current Save Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_bounced_content +msgid "Custom Bounced Message" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_01_demo +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Customer" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_08_demo +msgid "Customer Invoice" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__access_url +#: model:ir.model.fields,help:dms.field_dms_file__access_url +msgid "Customer Portal URL" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +msgid "DMS" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_security_mixin +msgid "DMS Security Mixin" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_mixins_thumbnail +msgid "DMS thumbnail and icon mixin" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__database +msgid "Database" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_defaults +msgid "Default Values" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define forbidden file extensions" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Define the maximum upload size of a file in MB" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Defines a list of forbidden file extensions. (Example: 'exe,msi')" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_res_config_settings__documents_binary_max_size +msgid "Defines the maximum upload size in MB. Default (25MB)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_unlink +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_unlink +msgid "Delete Access" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_storage +#: model:ir.actions.act_window,name:dms.action_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_access_group__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_category__directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_directory_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__directory_ids +#: model:ir.ui.menu,name:dms.menu_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_directories_storage +#: model_terms:ir.actions.act_window,help:dms.action_dms_directory +msgid "" +"Directories can be used to structure and organize\n" +" files directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_directory +#: model:ir.model.fields,field_description:dms.field_dms_file__directory_id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__directory_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_create_directory +msgid "Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__display_name +#: model:ir.model.fields,field_description:dms.field_dms_category__display_name +#: model:ir.model.fields,field_description:dms.field_dms_directory__display_name +#: model:ir.model.fields,field_description:dms.field_dms_file__display_name +#: model:ir.model.fields,field_description:dms.field_dms_storage__display_name +#: model:ir.model.fields,field_description:dms.field_dms_tag__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__display_name +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__display_name +msgid "Display Name" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/path_json/path_owl.esm.js:0 +msgid "Dms Path Field" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_category +msgid "Document Category" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_document_storage +msgid "Document Storage Created!" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_tag +msgid "Document Tag" +msgstr "" + +#. module: dms +#: model:ir.module.category,name:dms.category_dms_security +#: model:ir.ui.menu,name:dms.main_menu_dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms_breadcrumbs +#: model_terms:ir.ui.view,arch_db:dms.portal_my_home_dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Documents" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_directory_state +msgid "Documents Onboarding Directory State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_file_state +msgid "Documents Onboarding File State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_state +msgid "Documents Onboarding State" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_company__documents_onboarding_storage_state +msgid "Documents Onboarding Storage State" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__done +msgid "Done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_lock_editor +msgid "Editor" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_email +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Email Alias" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_mail_thread +msgid "Email Thread" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_domain +msgid "Email domain e.g. 'example.com' in 'odoo@example.com'" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_category.py:0 +msgid "Error! You cannot create recursive categories." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "Error! You cannot create recursive directories." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__explicit_user_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Explicit Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__extension +msgid "Extension" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_forbidden_extensions +msgid "Extensions" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_05_demo +msgid "External" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_file +#: model:onboarding.onboarding.step,title:dms.onboarding_step_upload_file +msgid "File" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Extensions" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding,name:dms.onboarding_onboarding_dms_file +msgid "File Onboarding" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Size" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "File Upload" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_file +#: model:ir.actions.act_window,name:dms.action_dms_file_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_storage_migration +#: model:ir.actions.act_window,name:dms.action_dms_file_wizard_selector +#: model:ir.actions.act_window,name:dms.action_dms_files_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_directory +#: model:ir.actions.act_window,name:dms.action_dms_files_storage +#: model:ir.model.fields,field_description:dms.field_dms_category__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__file_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__storage_file_ids +#: model:ir.model.fields,field_description:dms.field_dms_tag__file_ids +#: model:ir.ui.menu,name:dms.menu_dms_file +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Files" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_file +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_file_storage_migration +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_all_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_directory +#: model_terms:ir.actions.act_window,help:dms.action_dms_files_storage +msgid "Files are used to save content directly in Odoo." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_storage__save_type__file +msgid "Filestore" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_upload_file +msgid "First File Uploaded!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_follower_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_follower_ids +msgid "Followers" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_partner_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_partner_ids +msgid "Followers (Partners)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_type_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_type_icon +msgid "Font awesome icon e.g. fa-tasks" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_settings_general +#: model:ir.ui.menu,name:dms.menu_dms_settings_general +msgid "General Settings" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Group" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_search +msgid "Group By" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__name +msgid "Group Name" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__users +msgid "Group Users" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__group_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__group_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__has_message +#: model:ir.model.fields,field_description:dms.field_dms_file__has_message +msgid "Has Message" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_02_demo +msgid "Human Resource" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__id +#: model:ir.model.fields,field_description:dms.field_dms_category__id +#: model:ir.model.fields,field_description:dms.field_dms_directory__id +#: model:ir.model.fields,field_description:dms.field_dms_file__id +#: model:ir.model.fields,field_description:dms.field_dms_storage__id +#: model:ir.model.fields,field_description:dms.field_dms_tag__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__id +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__id +msgid "ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_thread_id +msgid "" +"ID of the parent record holding the alias (example: project holding the task" +" creation alias)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_exception_icon +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_kanban +msgid "Icon" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_file__icon_url +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__icon_url +msgid "Icon URL" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_icon +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_icon +msgid "Icon to indicate an exception activity." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_file__active +msgid "If a file is set to archived, it is not displayed, but still exists." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction +msgid "If checked, new messages require your attention." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error +msgid "If checked, some messages have a delivery error." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__company_id +#: model:ir.model.fields,help:dms.field_dms_directory__company_id +#: model:ir.model.fields,help:dms.field_dms_file__company_id +#: model:ir.model.fields,help:dms.field_dms_storage__company_id +msgid "" +"If set, directories and files will only be available for the selected " +"company." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_bounced_content +msgid "" +"If set, this content will automatically be sent out to unauthorized users " +"instead of the default message." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1920 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1920 +msgid "Image" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_1024 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_1024 +msgid "Image 1024" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_128 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_128 +msgid "Image 128" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_256 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_256 +msgid "Image 256" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_file__image_512 +#: model:ir.model.fields,field_description:dms.field_dms_mixins_thumbnail__image_512 +msgid "Image 512" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,help:dms.field_dms_storage__inherit_access_from_parent_record +msgid "" +"Indicate if directories and files access work only with related model access" +" (for example, if some directories are related with any sale, only users " +"with read access to these sale can access)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_storage__include_message_attachments +msgid "" +"Indicate if directories and files auto-create in mail composition process " +"too" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,help:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,help:dms.field_dms_file__is_hidden +#: model:ir.model.fields,help:dms.field_dms_storage__is_hidden +msgid "Indicates if directories and files are hidden by default." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__is_root_directory +msgid "" +"Indicates if the directory is a root directory.\n" +" A root directory has a settings object, while a directory with a set\n" +" parent inherits the settings form its parent." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__inherit_group_ids +msgid "Inherit Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_inherit_access_from_parent_record +#: model:ir.model.fields,field_description:dms.field_dms_storage__inherit_access_from_parent_record +msgid "Inherit permissions from related record" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_create +msgid "Inherited Create Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_unlink +msgid "Inherited Unlink Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_inclusive_write +msgid "Inherited Write Access" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_01_demo +msgid "Internal" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Internal / Human Resource" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Invalid attachments!" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Invoices" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_is_follower +#: model:ir.model.fields,field_description:dms.field_dms_file__message_is_follower +msgid "Is Follower" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_root_directory +msgid "Is Root Directory" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change the storage." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "It is not possible to change to a parent with other storage." +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__just_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__just_done +msgid "Just done" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_category__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_file__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_uid +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_uid +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__write_date +#: model:ir.model.fields,field_description:dms.field_dms_category__write_date +#: model:ir.model.fields,field_description:dms.field_dms_directory__write_date +#: model:ir.model.fields,field_description:dms.field_dms_file__write_date +#: model:ir.model.fields,field_description:dms.field_dms_storage__write_date +#: model:ir.model.fields,field_description:dms.field_dms_tag__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_file_move__write_date +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Last update" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__share_link +msgid "Link" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__allowed_model_ids +#: model:ir.model.fields,field_description:dms.field_dms_storage__model_ids +msgid "Linked Models" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_model +#: model:ir.model.fields,field_description:dms.field_dms_file__res_model +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_model +msgid "Linked attachments model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__res_id +#: model:ir.model.fields,field_description:dms.field_dms_file__res_id +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__res_id +msgid "Linked attachments record ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_incoming_local +msgid "Local-part based incoming detection" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Lock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__is_locked +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Locked" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__locked_by +msgid "Locked By" +msgstr "" + +#. module: dms +#: model:res.groups,name:dms.group_dms_manager +msgid "Manager" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Manual File Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error +msgid "Message Delivery error" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__message_ids +msgid "Messages" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Meta Information" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_dms_attachment_migrate +msgid "Migrate" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Migrate File %(index)s of %(record_count)s [ %(dms_file_migration)s ]" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Migrate Files" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.menu_dms_file_migration +msgid "Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__migration +msgid "Migration Status" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__model_id +#: model:ir.model.fields,field_description:dms.field_dms_storage__model +msgid "Model" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "Modification Date" +msgstr "" + +#. module: dms +#: model:ir.actions.server,name:dms.action_wizard_dms_file_move +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Move" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_file_move_act_window +msgid "Move files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__my_activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__my_activity_date_deadline +msgid "My Activity Deadline" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "My Directories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "My Documents" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +msgid "My Files" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/controllers/portal.py:0 +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__name +#: model:ir.model.fields,field_description:dms.field_dms_category__name +#: model:ir.model.fields,field_description:dms.field_dms_directory__name +#: model:ir.model.fields,field_description:dms.field_dms_file__name +#: model:ir.model.fields,field_description:dms.field_dms_storage__name +#: model:ir.model.fields,field_description:dms.field_dms_tag__name +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Name" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directory_new +#: model:ir.actions.act_window,name:dms.action_dms_file_new +msgid "New Root Directory" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage_new +msgid "New Storage" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_06_demo +msgid "News" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_date_deadline +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_date_deadline +msgid "Next Activity Deadline" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_summary +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_summary +msgid "Next Activity Summary" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_type_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_type_id +msgid "Next Activity Type" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "No attachment was provided" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_directory_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_file_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_state__not_done +#: model:ir.model.fields.selection,name:dms.selection__res_company__documents_onboarding_storage_state__not_done +msgid "Not done" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "Not results" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__note +msgid "Note" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_needaction_counter +msgid "Number of Actions" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,field_description:dms.field_dms_file__message_has_error_counter +msgid "Number of errors" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_needaction_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_needaction_counter +msgid "Number of messages requiring action" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__message_has_error_counter +#: model:ir.model.fields,help:dms.field_dms_file__message_has_error_counter +msgid "Number of messages with delivery error" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding +msgid "Onboarding" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_create_directory +msgid "Onboarding Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_upload_file +msgid "Onboarding File" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_onboarding_onboarding_step +msgid "Onboarding Step" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,step_image_alt:dms.onboarding_step_document_storage +msgid "Onboarding Storage" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "Only files in the same root directory can be moved." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/storage.py:0 +msgid "Only managers can execute this action." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_force_thread_id +msgid "" +"Optional ID of a thread (record) to which all incoming messages will be " +"attached, even if they did not reply to it. If set, this will disable the " +"creation of new records completely." +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_organizing +msgid "Organizing" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_id +msgid "Parent Category" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_group_id +msgid "Parent Group" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_model_id +msgid "Parent Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_category__parent_path +#: model:ir.model.fields,field_description:dms.field_dms_directory__parent_path +msgid "Parent Path" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_parent_thread_id +msgid "Parent Record Thread ID" +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/access_groups.py:0 +msgid "Parent group '%(parent)s' is child of '%(current)s'." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_parent_model_id +msgid "" +"Parent model holding the alias. The model holding the alias reference is not" +" necessarily the model given by alias_model_id (example: project " +"(parent_model) and task (model))" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_02_demo +msgid "Partner" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_json +msgid "Path Json" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__path_names +msgid "Path Names" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_contact +msgid "" +"Policy to post a message on the document using the mailgateway.\n" +"- everyone: everyone can post\n" +"- partners: only authenticated partners\n" +"- followers: only followers of the related document or members of following channels\n" +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_02_demo +#: model:dms.tag,name:dms.tag_05_demo +msgid "Portal" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_url +#: model:ir.model.fields,field_description:dms.field_dms_file__access_url +msgid "Portal Access URL" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.xml:0 +msgid "Preview" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/fields/preview_binary/preview_record.esm.js:0 +msgid "Preview Record" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_10_demo +msgid "Product" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_03_demo +msgid "Project" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_read +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_read +msgid "Read Access" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__partner_ids +msgid "Recipients" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_file__record_ref +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_force_thread_id +msgid "Record Thread ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__resource_ref +msgid "Related Document" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_id +msgid "Related Document ID" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_wizard_dms_share__res_model +msgid "Related Document Model" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__require_migration +msgid "Require Migration" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__activity_user_id +#: model:ir.model.fields,field_description:dms.field_dms_file__activity_user_id +msgid "Responsible User" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_storage__root_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Root Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__root_directory_id +#: model:ir.model.fields,field_description:dms.field_dms_file__root_directory_id +msgid "Root Directory" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,done_text:dms.onboarding_step_create_directory +msgid "Root Directory Created!" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_04_demo +msgid "Sales" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,field_description:dms.field_dms_storage__save_type +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_search +msgid "Save Type" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Scan" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__access_token +#: model:ir.model.fields,field_description:dms.field_dms_file__access_token +msgid "Security Token" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Settings" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.wizard_dms_directory_share_action +#: model:ir.actions.act_window,name:dms.wizard_dms_file_share_action +msgid "Share" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Show storages" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__files +msgid "Single Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__size +#: model:ir.model.fields,field_description:dms.field_dms_file__size +#: model:ir.model.fields,field_description:dms.field_res_config_settings__documents_binary_max_size +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_migration_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_tree +#: model_terms:ir.ui.view,arch_db:dms.view_dms_storage_form +msgid "Size" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__human_size +#: model:ir.model.fields,field_description:dms.field_dms_file__human_size +msgid "Size (human readable)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__starred +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_kanban +msgid "Starred" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +msgid "Starred Directories" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__user_star_ids +msgid "Stars" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_state +#: model:ir.model.fields,help:dms.field_dms_file__activity_state +msgid "" +"Status based on activities\n" +"Overdue: Due date is already passed\n" +"Today: Activity date is today\n" +"Planned: Future activities." +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_dms_storage +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_directory__storage_id +#: model:ir.model.fields,field_description:dms.field_dms_file__storage_id +#: model:onboarding.onboarding.step,title:dms.onboarding_step_document_storage +#: model_terms:ir.ui.view,arch_db:dms.search_dms_directory +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file +#: model_terms:ir.ui.view,arch_db:dms.search_dms_file_migration +msgid "Storage" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_abstract_dms_mixin__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_directory__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_file__is_hidden +#: model:ir.model.fields,field_description:dms.field_dms_storage__is_hidden +msgid "Storage is Hidden" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_storage +#: model:ir.ui.menu,name:dms.menu_dms_storage +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "Storages" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_storage +msgid "Storages are used to configure your Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Subcategories" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_directories_all_directory +#: model:ir.actions.act_window,name:dms.action_dms_directories_directory +#: model:ir.model.fields,field_description:dms.field_dms_directory__child_directory_ids +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "Subdirectories" +msgstr "" + +#. module: dms +#: model:ir.model.fields.selection,name:dms.selection__dms_directory__alias_process__directory +msgid "Subdirectory" +msgstr "" + +#. module: dms +#: model:ir.ui.menu,name:dms.cat_menu_dms_config_system +msgid "System" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_tag_form +msgid "Tag" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_tag_name_uniq +msgid "Tag name already exists!" +msgstr "" + +#. module: dms +#: model:ir.actions.act_window,name:dms.action_dms_tag +#: model:ir.model.fields,field_description:dms.field_dms_category__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_directory__tag_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__tag_ids +#: model:ir.ui.menu,name:dms.menu_dms_tag +#: model_terms:ir.ui.view,arch_db:dms.view_dms_category_form +msgid "Tags" +msgstr "" + +#. module: dms +#: model_terms:ir.actions.act_window,help:dms.action_dms_tag +msgid "Tags are used to categorize Documents." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_new_form +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Tags..." +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Technical Information" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_category__active +msgid "The active field allows you to hide the category without removing it." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_tag__active +msgid "The active field allows you to hide the tag without removing it." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "The directory name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file has a forbidden file extension." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The file name is invalid." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/dms_file.py:0 +msgid "The maximum upload size is %s MB." +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_model_id +msgid "" +"The model (Odoo Document Kind) to which this alias corresponds. Any incoming" +" email that does not reply to an existing record will cause the creation of " +"a new record of this model (e.g. a Project Task)" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__alias_name +msgid "" +"The name of the email alias, e.g. 'jobs' if you want to catch emails for " +"" +msgstr "" + +#. module: dms +#: model:ir.model.constraint,message:dms.constraint_dms_access_group_name_uniq +msgid "The name of the group must be unique!" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_abstract_dms_mixin__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_directory__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_file__storage_id_save_type +#: model:ir.model.fields,help:dms.field_dms_storage__save_type +msgid "" +"The save type is used to determine how a file is saved by the system. If you" +" change this setting, you can migrate existing files manually by triggering " +"the action." +msgstr "" + +#. module: dms +#. odoo-python +#: code:addons/dms/models/directory.py:0 +msgid "This directory needs to be associated to a record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_elements +msgid "Total Elements" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_files +msgid "Total Files" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__count_total_directories +msgid "Total Subdirectories" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.wizard_dms_file_move_form_view +msgid "Total files" +msgstr "" + +#. module: dms +#: model:dms.category,name:dms.category_04_demo +msgid "Traveling" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_file__mimetype +msgid "Type" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__activity_exception_decoration +#: model:ir.model.fields,help:dms.field_dms_file__activity_exception_decoration +msgid "Type of the exception activity on record." +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_unlink +msgid "Unlink Access" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_file_form +msgid "Unlock" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__alias_process +msgid "Unpack Emails as" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/file_kanban_controller.xml:0 +#: code:addons/dms/static/src/js/views/file_kanban_renderer.xml:0 +#: code:addons/dms/static/src/js/views/file_list_renderer.xml:0 +msgid "Upload" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,button_text:dms.onboarding_step_upload_file +msgid "Upload File" +msgstr "" + +#. module: dms +#: model:onboarding.onboarding.step,description:dms.onboarding_step_upload_file +msgid "Upload your first File." +msgstr "" + +#. module: dms +#: model:dms.access.group,name:dms.access_group_03_demo +#: model:res.groups,name:dms.group_dms_user +msgid "User" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_access_groups_form +msgid "Users" +msgstr "" + +#. module: dms +#: model:dms.tag,name:dms.tag_09_demo +msgid "Vendor Bill" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,field_description:dms.field_dms_file__website_message_ids +msgid "Website Messages" +msgstr "" + +#. module: dms +#: model:ir.model.fields,help:dms.field_dms_directory__website_message_ids +#: model:ir.model.fields,help:dms.field_dms_file__website_message_ids +msgid "Website communication history" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_file_move +msgid "Wizard Dms File Move" +msgstr "" + +#. module: dms +#: model:ir.model,name:dms.model_wizard_dms_share +msgid "Wizard for sharing DMS records" +msgstr "" + +#. module: dms +#: model:ir.model.fields,field_description:dms.field_dms_access_group__perm_write +#: model:ir.model.fields,field_description:dms.field_dms_directory__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_file__permission_write +#: model:ir.model.fields,field_description:dms.field_dms_security_mixin__permission_write +msgid "Write Access" +msgstr "" + +#. module: dms +#. odoo-javascript +#: code:addons/dms/static/src/js/views/dms_file_upload.esm.js:0 +msgid "You must select a directory first" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.portal_my_dms +msgid "element(s)" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.res_config_settings_view_form +msgid "exe,msi" +msgstr "" + +#. module: dms +#: model_terms:ir.ui.view,arch_db:dms.view_dms_directory_form +msgid "mail.catchall.domain" +msgstr "" diff --git a/dms/models/__init__.py b/dms/models/__init__.py new file mode 100644 index 000000000..cded704ac --- /dev/null +++ b/dms/models/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from . import access_groups +from . import base +from . import mixins_thumbnail +from . import dms_security_mixin +from . import abstract_dms_mixin + +from . import storage +from . import directory +from . import dms_file + +from . import onboarding_onboarding +from . import onboarding_onboarding_step +from . import dms_category +from . import tag + +from . import res_company +from . import res_config_settings +from . import ir_attachment +from . import ir_binary +from . import mail_thread +from . import res_users diff --git a/dms/models/abstract_dms_mixin.py b/dms/models/abstract_dms_mixin.py new file mode 100644 index 000000000..a20145878 --- /dev/null +++ b/dms/models/abstract_dms_mixin.py @@ -0,0 +1,57 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from odoo import api, fields, models + + +class AbstractDmsMixin(models.AbstractModel): + _name = "abstract.dms.mixin" + _description = "Abstract Dms Mixin" + + name = fields.Char(required=True, index="btree") + # Only defined to prevent error in other fields that related it + storage_id = fields.Many2one( + comodel_name="dms.storage", string="Storage", store=True, copy=True + ) + is_hidden = fields.Boolean( + string="Storage is Hidden", + related="storage_id.is_hidden", + readonly=True, + store=True, + ) + company_id = fields.Many2one( + related="storage_id.company_id", + comodel_name="res.company", + string="Company", + readonly=True, + store=True, + index="btree", + ) + storage_id_save_type = fields.Selection(related="storage_id.save_type", store=False) + color = fields.Integer(default=0) + category_id = fields.Many2one( + comodel_name="dms.category", + context={"dms_category_show_path": True}, + string="Category", + ) + + @api.model + def search_panel_select_range(self, field_name, **kwargs): + """Add context to display short folder name.""" + _self = self.with_context( + directory_short_name=True, skip_sanitized_parent_hierarchy=True + ) + return super(AbstractDmsMixin, _self).search_panel_select_range( + field_name, **kwargs + ) + + def _search_panel_sanitized_parent_hierarchy(self, records, parent_name, ids): + if self.env.context.get("skip_sanitized_parent_hierarchy"): + all_ids = [value["id"] for value in records] + # Prevent error if user not access to parent record + for value in records: + if value["parent_id"] and value["parent_id"][0] not in all_ids: + value["parent_id"] = False + return records + return super()._search_panel_sanitized_parent_hierarchy( + records=records, parent_name=parent_name, ids=ids + ) diff --git a/dms/models/access_groups.py b/dms/models/access_groups.py new file mode 100644 index 000000000..fccff0d05 --- /dev/null +++ b/dms/models/access_groups.py @@ -0,0 +1,177 @@ +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2020 RGB Consulting +# Copyright 2024 Timothée Vannier - Subteno (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class DmsAccessGroups(models.Model): + _name = "dms.access.group" + _description = "Record Access Groups" + _parent_store = True + _parent_name = "parent_group_id" + + name = fields.Char(string="Group Name", required=True, translate=True) + parent_path = fields.Char(index="btree") + + # Permissions written directly on this group + perm_create = fields.Boolean(string="Create Access") + perm_write = fields.Boolean(string="Write Access") + perm_unlink = fields.Boolean(string="Unlink Access") + + # Permissions computed including parent group + perm_inclusive_create = fields.Boolean( + string="Inherited Create Access", + compute="_compute_inclusive_permissions", + store=True, + recursive=True, + ) + perm_inclusive_write = fields.Boolean( + string="Inherited Write Access", + compute="_compute_inclusive_permissions", + store=True, + recursive=True, + ) + perm_inclusive_unlink = fields.Boolean( + string="Inherited Unlink Access", + compute="_compute_inclusive_permissions", + store=True, + recursive=True, + ) + + directory_ids = fields.Many2many( + comodel_name="dms.directory", + relation="dms_directory_groups_rel", + string="Directories", + column1="gid", + column2="aid", + auto_join=True, + readonly=True, + ) + complete_directory_ids = fields.Many2many( + comodel_name="dms.directory", + relation="dms_directory_complete_groups_rel", + column1="gid", + column2="aid", + string="Complete directories", + auto_join=True, + readonly=True, + ) + count_users = fields.Integer(compute="_compute_users", store=True) + count_directories = fields.Integer(compute="_compute_count_directories") + parent_group_id = fields.Many2one( + comodel_name="dms.access.group", + string="Parent Group", + ondelete="cascade", + index="btree", + ) + + child_group_ids = fields.One2many( + comodel_name="dms.access.group", + inverse_name="parent_group_id", + string="Child Groups", + ) + group_ids = fields.Many2many( + comodel_name="res.groups", + relation="dms_access_group_groups_rel", + column1="gid", + column2="rid", + string="Groups", + ) + explicit_user_ids = fields.Many2many( + comodel_name="res.users", + relation="dms_access_group_explicit_users_rel", + column1="gid", + column2="uid", + string="Explicit Users", + ) + users = fields.Many2many( + comodel_name="res.users", + relation="dms_access_group_users_rel", + column1="gid", + column2="uid", + string="Group Users", + compute="_compute_users", + auto_join=True, + store=True, + recursive=True, + ) + + @api.depends("directory_ids") + def _compute_count_directories(self): + for record in self: + record.count_directories = len(record.directory_ids) + + _sql_constraints = [ + ("name_uniq", "unique (name)", "The name of the group must be unique!") + ] + + @api.depends( + "parent_group_id.perm_inclusive_create", + "parent_group_id.perm_inclusive_unlink", + "parent_group_id.perm_inclusive_write", + "parent_path", + "perm_create", + "perm_unlink", + "perm_write", + ) + def _compute_inclusive_permissions(self): + """Provide full permissions inheriting from parent recursively.""" + for one in self: + one.update( + { + f"perm_inclusive_{perm}": ( + one[f"perm_{perm}"] + or one.parent_group_id[f"perm_inclusive_{perm}"] + ) + for perm in ("create", "unlink", "write") + } + ) + + @api.model + def default_get(self, fields_list): + res = super().default_get(fields_list) + if res.get("explicit_user_ids"): + res["explicit_user_ids"] = res["explicit_user_ids"] + [self.env.uid] + else: + res["explicit_user_ids"] = [(6, 0, [self.env.uid])] + return res + + @api.depends( + "parent_group_id", + "parent_group_id.users", + "group_ids", + "group_ids.user_ids", + "explicit_user_ids", + ) + def _compute_users(self): + for record in self: + users = ( + record.group_ids.user_ids + | record.explicit_user_ids + | record.parent_group_id.users + ) + record.update({"users": users, "count_users": len(users)}) + + def copy_data(self, default=None): + vals_list = super().copy_data(default) + for group, vals in zip(self, vals_list, strict=False): + vals["name"] = _("%s (copy)") % group.name + return vals_list + + @api.constrains("parent_path") + def _check_parent_recursiveness(self): + """ + Forbid recursive relationships. + """ + for one in self.filtered("parent_group_id"): + if str(one.id) in one.parent_path.split("/"): + raise ValidationError( + _("Parent group '%(parent)s' is child of '%(current)s'.") + % { + "parent": one.parent_group_id.display_name, + "current": one.display_name, + } + ) diff --git a/dms/models/base.py b/dms/models/base.py new file mode 100644 index 000000000..8d47fabcd --- /dev/null +++ b/dms/models/base.py @@ -0,0 +1,33 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# Copyright 2024 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import models + + +class Base(models.AbstractModel): + _inherit = "base" + + def unlink(self): + """Cascade DMS related resources removal. + Avoid executing in ir.* models (ir.mode, ir.model.fields, etc), in transient + models and in the models we want to check.""" + result = super().unlink() + if ( + self.ids + and not self._name.startswith("ir.") + and not self.is_transient() + and self._name not in ("dms.file", "dms.directory") + ): + domain = [("res_model", "=", self._name), ("res_id", "in", self.ids)] + # Has to check if existing before unlinking, because even if the search + # returns an empty recordset, it will still call the unlink method on it. + # This can result in an infinite loop and a recursion depth error. + files = self.env["dms.file"].sudo().search(domain) + if files: + files.unlink() + directories = self.env["dms.directory"].sudo().search(domain) + if directories: + directories.unlink() + return result diff --git a/dms/models/directory.py b/dms/models/directory.py new file mode 100644 index 000000000..34127d2d2 --- /dev/null +++ b/dms/models/directory.py @@ -0,0 +1,777 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import ast +import base64 +import logging +import os +from ast import literal_eval +from collections import defaultdict +from typing import Literal # noqa # pylint: disable=unused-import + +from odoo import _, api, fields, models, tools +from odoo.exceptions import UserError, ValidationError +from odoo.osv.expression import AND, OR +from odoo.tools import consteq, human_size + +from ..tools.file import check_name, unique_name + +_logger = logging.getLogger(__name__) +_path = os.path.dirname(os.path.dirname(__file__)) + + +class DmsDirectory(models.Model): + _name = "dms.directory" + _description = "Directory" + + _inherit = [ + "portal.mixin", + "dms.security.mixin", + "dms.mixins.thumbnail", + "mail.thread", + "mail.activity.mixin", + "mail.alias.mixin", + "abstract.dms.mixin", + ] + + _rec_name = "complete_name" + _order = "complete_name" + + _parent_store = True + _parent_name = "parent_id" + _directory_field = _parent_name + + parent_path = fields.Char(index="btree") + is_root_directory = fields.Boolean( + default=False, + help="""Indicates if the directory is a root directory. + A root directory has a settings object, while a directory with a set + parent inherits the settings form its parent.""", + ) + + # Override acording to defined in AbstractDmsMixin + storage_id = fields.Many2one( + compute="_compute_storage_id", + compute_sudo=True, + readonly=False, + comodel_name="dms.storage", + string="Storage", + ondelete="restrict", + auto_join=True, + store=True, + ) + parent_id = fields.Many2one( + comodel_name="dms.directory", + string="Parent Directory", + domain="[('permission_create', '=', True)]", + ondelete="restrict", + # Access to a directory doesn't necessarily mean access its parent, so + # prefetching this field could lead to misleading access errors + prefetch=False, + index="btree", + store=True, + readonly=False, + compute="_compute_parent_id", + copy=True, + default=lambda self: self._default_parent_id(), + ) + + root_directory_id = fields.Many2one( + "dms.directory", "Root Directory", compute="_compute_root_id", store=True + ) + + def _default_parent_id(self): + context = self.env.context + if context.get("active_model") == self._name and context.get("active_id"): + return context["active_id"] + else: + return False + + group_ids = fields.Many2many( + comodel_name="dms.access.group", + relation="dms_directory_groups_rel", + column1="aid", + column2="gid", + string="Groups", + ) + complete_group_ids = fields.Many2many( + comodel_name="dms.access.group", + relation="dms_directory_complete_groups_rel", + column1="aid", + column2="gid", + string="Complete Groups", + compute="_compute_groups", + readonly=True, + store=True, + compute_sudo=True, + recursive=True, + ) + complete_name = fields.Char( + compute="_compute_complete_name", store=True, recursive=True + ) + child_directory_ids = fields.One2many( + comodel_name="dms.directory", + inverse_name="parent_id", + string="Subdirectories", + auto_join=False, + copy=True, + ) + + tag_ids = fields.Many2many( + comodel_name="dms.tag", + relation="dms_directory_tag_rel", + domain="""[ + '|', ['category_id', '=', False], + ['category_id', 'child_of', category_id]] + """, + column1="did", + column2="tid", + string="Tags", + compute="_compute_tags", + readonly=False, + store=True, + ) + + user_star_ids = fields.Many2many( + comodel_name="res.users", + relation="dms_directory_star_rel", + column1="did", + column2="uid", + string="Stars", + ) + + starred = fields.Boolean( + compute="_compute_starred", + inverse="_inverse_starred", + search="_search_starred", + ) + + file_ids = fields.One2many( + comodel_name="dms.file", + inverse_name="directory_id", + string="Files", + auto_join=False, + copy=True, + ) + + count_directories = fields.Integer( + compute="_compute_count_directories", string="Count Subdirectories Title" + ) + + count_files = fields.Integer( + compute="_compute_count_files", string="Count Files Title" + ) + + count_directories_title = fields.Char( + compute="_compute_count_directories", string="Count Subdirectories" + ) + + count_files_title = fields.Char( + compute="_compute_count_files", string="Count Files" + ) + + count_elements = fields.Integer(compute="_compute_count_elements") + + count_total_directories = fields.Integer( + compute="_compute_count_total_directories", string="Total Subdirectories" + ) + + count_total_files = fields.Integer( + compute="_compute_count_total_files", string="Total Files" + ) + + count_total_elements = fields.Integer( + compute="_compute_count_total_elements", string="Total Elements" + ) + + size = fields.Float(compute="_compute_size") + human_size = fields.Char( + compute="_compute_human_size", string="Size (human readable)" + ) + + inherit_group_ids = fields.Boolean(string="Inherit Groups", default=True) + + alias_process = fields.Selection( + selection=[("files", "Single Files"), ("directory", "Subdirectory")], + required=True, + default="directory", + string="Unpack Emails as", + help="""\ + Define how incoming emails are processed:\n + - Single Files: The email gets attached to the directory and + all attachments are created as files.\n + - Subdirectory: A new subdirectory is created for each email + and the mail is attached to this subdirectory. The attachments + are created as files of the subdirectory. + """, + ) + + @api.model + def _get_domain_by_access_groups(self, operation): + """Special rules for directories.""" + self_filter = [ + ("storage_id_inherit_access_from_parent_record", "=", False), + ("id", "in", self._get_access_groups_query(operation)), + ] + # Upstream only filters by parent directory + result = super()._get_domain_by_access_groups(operation) + if operation == "create": + # When creating, I need create access in parent directory, or + # self-create permission if it's a root directory + result = OR( + [ + [("is_root_directory", "=", False)] + result, + [("is_root_directory", "=", True)] + self_filter, + ] + ) + else: + # In other operations, I only need self access + result = self_filter + return result + + def _compute_access_url(self): + res = super()._compute_access_url() + for item in self: + item.access_url = f"/my/dms/directory/{item.id}" + return res + + def check_access_token(self, access_token=False): + res = False + if access_token: + items = ( + self.env["dms.directory"] + .sudo() + .search([("access_token", "=", access_token)]) + ) + if items: + item = items[0] + if item.id == self.id: + return True + # sudo because the user might not usually have access to the record but + # now the token is valid. + directory_item = self.sudo() + while directory_item.parent_id: + if directory_item.id == item.id: + return True + directory_item = directory_item.parent_id + # Fix last level + if directory_item.id == item.id: + return True + return res + + @api.model + def _get_parent_categories(self, access_token): + self.ensure_one() + directories = [] + current_directory = self + while current_directory: + directories.insert(0, current_directory) + if ( + ( + access_token + and current_directory.access_token + and consteq(current_directory.access_token, access_token) + ) + or not access_token + and current_directory.check_access("read") + ): + return directories + current_directory = current_directory.parent_id + if access_token: + # Reaching here means we didn't find the directory accessible by this token + return [self] + return directories + + def _get_own_root_directories(self): + res = self.env["dms.directory"].search_read( + [("is_hidden", "=", False)], ["parent_id"] + ) + all_ids = [value["id"] for value in res] + res_ids = [] + for item in res: + if not item["parent_id"] or item["parent_id"][0] not in all_ids: + res_ids.append(item["id"]) + return res_ids + + allowed_model_ids = fields.Many2many( + related="storage_id.model_ids", + comodel_name="ir.model", + ) + model_id = fields.Many2one( + comodel_name="ir.model", + domain="[('id', 'in', allowed_model_ids)]", + compute="_compute_model_id", + inverse="_inverse_model_id", + string="Model", + store=True, + ) + storage_id_save_type = fields.Selection( + related="storage_id.save_type", + related_sudo=True, + readonly=True, + store=False, + prefetch=False, + ) + storage_id_inherit_access_from_parent_record = fields.Boolean( + related="storage_id.inherit_access_from_parent_record", + related_sudo=True, + store=True, + ) + + @api.depends("res_model") + def _compute_model_id(self): + for record in self: + if not record.res_model: + record.model_id = False + continue + record.model_id = ( + self.env["ir.model"].sudo().search([("model", "=", record.res_model)]) + ) + + def _inverse_model_id(self): + for record in self: + record.res_model = record.model_id.model + + def toggle_starred(self): + updates = defaultdict(set) + for record in self: + vals = {"starred": not record.starred} + updates[tools.frozendict(vals)].add(record.id) + for vals, ids in updates.items(): + self.browse(ids).write(dict(vals)) + self.flush_recordset() + + # SearchPanel + @api.model + def search_panel_select_range(self, field_name, **kwargs): + context = {} + if field_name == "parent_id": + context["directory_short_name"] = True + return super( + DmsDirectory, self.with_context(**context) + ).search_panel_select_range(field_name, **kwargs) + + @api.model + def search_panel_select_multi_range(self, field_name, **kwargs): + return super( + DmsDirectory, self.with_context(category_short_name=True) + ).search_panel_select_multi_range(field_name, **kwargs) + + # Actions + def action_save_onboarding_directory_step(self): + self.env.user.company_id.set_onboarding_step_done( + "documents_onboarding_directory_state" + ) + + # SearchPanel + @api.model + def _search_panel_directory(self, **kwargs): + search_domain = (kwargs.get("search_domain", []),) + if search_domain and len(search_domain): + for domain in search_domain[0]: + if domain[0] == "parent_id": + return domain[1], domain[2] + return None, None + + # Search + @api.model + def _search_starred(self, operator, operand): + if operator == "=" and operand: + return [("user_star_ids", "in", [self.env.uid])] + return [("user_star_ids", "not in", [self.env.uid])] + + @api.depends("name", "parent_id.complete_name") + def _compute_complete_name(self): + for category in self: + if category.parent_id: + category.complete_name = ( + f"{category.parent_id.complete_name} / {category.name}" + ) + else: + category.complete_name = category.name + + @api.depends("parent_id") + def _compute_storage_id(self): + for record in self: + if record.parent_id: + record.storage_id = record.parent_id.storage_id + else: + # HACK: Not needed in v14 due to odoo/odoo#64359 + record.storage_id = record.storage_id + + @api.depends("user_star_ids") + def _compute_starred(self): + for record in self: + record.starred = self.env.user in record.user_star_ids + + @api.depends("child_directory_ids") + def _compute_count_directories(self): + for record in self: + directories = len(record.child_directory_ids) + record.count_directories = directories + record.count_directories_title = _("%s Subdirectories") % directories + + @api.depends("file_ids") + def _compute_count_files(self): + for record in self: + files = len(record.file_ids) + record.count_files = files + record.count_files_title = _("%s Files") % files + + @api.depends("child_directory_ids", "file_ids") + def _compute_count_elements(self): + for record in self: + record.count_elements = record.count_files + record.count_directories + + def _compute_count_total_directories(self): + for record in self: + count = ( + self.search_count([("id", "child_of", record.id)]) if record.id else 0 + ) + record.count_total_directories = count - 1 if count > 0 else 0 + + def _compute_count_total_files(self): + model = self.env["dms.file"] + for record in self: + # Prevent error in some NewId cases + record.count_total_files = ( + model.search_count([("directory_id", "child_of", record.id)]) + if record.id + else 0 + ) + + def _compute_count_total_elements(self): + for record in self: + record.count_total_elements = ( + record.count_total_files + record.count_total_directories + ) + + def _compute_size(self): + sudo_model = self.env["dms.file"].sudo() + for record in self: + # Avoid NewId + if not record.id: + record.size = 0 + continue + recs = sudo_model.search_read( + domain=[("directory_id", "child_of", record.id)], + fields=["size"], + ) + record.size = sum(rec.get("size", 0) for rec in recs) + + @api.depends("size") + def _compute_human_size(self): + for item in self: + item.human_size = human_size(item.size) if item.size else False + + @api.depends( + "group_ids", + "inherit_group_ids", + "parent_id.complete_group_ids", + "parent_path", + ) + def _compute_groups(self): + """Get all DMS security groups affecting this directory.""" + for one in self: + groups = one.group_ids + if one.inherit_group_ids: + groups |= one.parent_id.complete_group_ids + self.complete_group_ids = groups + + # View + @api.depends("is_root_directory") + def _compute_parent_id(self): + for record in self: + if record.is_root_directory: + record.parent_id = None + else: + # HACK: Not needed in v14 due to odoo/odoo#64359 + record.parent_id = record.parent_id + + @api.depends("is_root_directory", "parent_id") + def _compute_root_id(self): + for record in self: + if record.is_root_directory: + record.root_directory_id = record + else: + # recursively check all parent nodes up to the root directory + if not record.parent_id.root_directory_id: + record.parent_id._compute_root_id() + record.root_directory_id = record.parent_id.root_directory_id + + @api.depends("category_id") + def _compute_tags(self): + for record in self: + tags = record.tag_ids.filtered( + lambda rec, record=record: not rec.category_id + or rec.category_id == record.category_id + ) + record.tag_ids = tags + + @api.onchange("storage_id") + def _onchange_storage_id(self): + for record in self: + if ( + record.storage_id.save_type == "attachment" + and record.storage_id.inherit_access_from_parent_record + ): + record.group_ids = False + + @api.onchange("model_id") + def _onchange_model_id(self): + self._inverse_model_id() + + # Constrains + @api.constrains("parent_id") + def _check_directory_recursion(self): + if self._has_cycle(): + raise ValidationError(_("Error! You cannot create recursive directories.")) + return True + + @api.constrains("storage_id", "model_id") + def _check_storage_id_attachment_model_id(self): + for record in self.filtered( + lambda directory: directory.storage_id.save_type == "attachment" + ): + if not record.model_id: + raise ValidationError( + _("A directory has to have model in attachment storage.") + ) + if not record.is_root_directory and not record.res_id: + raise ValidationError( + _("This directory needs to be associated to a record.") + ) + + @api.constrains("is_root_directory", "storage_id") + def _check_directory_storage(self): + for record in self: + if record.is_root_directory and not record.storage_id: + raise ValidationError(_("A root directory has to have a storage.")) + + @api.constrains("is_root_directory", "parent_id") + def _check_directory_parent(self): + for record in self: + if record.is_root_directory and record.parent_id: + raise ValidationError( + _("A directory can't be a root and have a parent directory.") + ) + if not record.is_root_directory and not record.parent_id: + raise ValidationError(_("A directory has to have a parent directory.")) + + @api.constrains("name") + def _check_name(self): + for record in self: + if self.env.context.get("check_name", True) and not check_name(record.name): + raise ValidationError(_("The directory name is invalid.")) + if record.is_root_directory: + children = record.sudo().storage_id.root_directory_ids + else: + children = record.sudo().parent_id.child_directory_ids + + if children.filtered( + lambda child, record=record: child.name == record.name + and child != record + ): + raise ValidationError( + _("A directory with the same name already exists.") + ) + + # Create, Update, Delete + def _inverse_starred(self): + starred_records = self.env["dms.directory"].sudo() + not_starred_records = self.env["dms.directory"].sudo() + for record in self: + if not record.starred and self.env.user in record.user_star_ids: + starred_records |= record + elif record.starred and self.env.user not in record.user_star_ids: + not_starred_records |= record + not_starred_records.write({"user_star_ids": [(4, self.env.uid)]}) + starred_records.write({"user_star_ids": [(3, self.env.uid)]}) + + def copy_data(self, default=None): + vals_list = super().copy_data(default) + for directory, vals in zip(self, vals_list, strict=False): + if vals.get("parent_id"): + parent_directory = self.browse(vals.get("parent_id")) + names = parent_directory.sudo().child_directory_ids.mapped("name") + elif directory.is_root_directory: + names = self.sudo().storage_id.root_directory_ids.mapped("name") + else: + names = self.sudo().parent_id.child_directory_ids.mapped("name") + vals["name"] = unique_name(directory.name, names) + return vals_list + + def _alias_get_creation_values(self): + values = super()._alias_get_creation_values() + values["alias_model_id"] = self.env["ir.model"].sudo()._get("dms.directory").id + if self.id: + values["alias_defaults"] = defaults = ast.literal_eval( + self.alias_defaults or "{}" + ) + defaults["parent_id"] = self.id + return values + + @api.model + def message_new(self, msg_dict, custom_values=None): + custom_values = custom_values if custom_values is not None else {} + parent_directory_id = custom_values.get("parent_id") + parent_directory = self.sudo().browse(parent_directory_id) + if not parent_directory_id or not parent_directory.exists(): + raise ValueError("No directory could be found!") + if parent_directory.alias_process == "files": + parent_directory._process_message(msg_dict) + return parent_directory + names = parent_directory.child_directory_ids.mapped("name") + slug = self.env["ir.http"]._slug + subject = slug(msg_dict.get("subject", _("Alias-Mail-Extraction"))) + defaults = dict( + {"name": unique_name(subject, names, escape_suffix=True)}, **custom_values + ) + directory = super().message_new(msg_dict, custom_values=defaults) + directory._process_message(msg_dict) + return directory + + def message_update(self, msg_dict, update_vals=None): + self._process_message(msg_dict, extra_values=update_vals) + return super().message_update(msg_dict, update_vals=update_vals) + + def _process_message(self, msg_dict, extra_values=False): + names = self.sudo().file_ids.mapped("name") + for attachment in msg_dict["attachments"]: + uname = unique_name(attachment.fname, names, escape_suffix=True) + vals = { + "directory_id": self.id, + "name": uname, + } + try: + vals["content"] = base64.b64encode(attachment.content) + except Exception: + vals["content"] = attachment.content + self.env["dms.file"].sudo().create(vals) + names.append(uname) + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get("parent_id", False): + parent = self.browse([vals["parent_id"]]) + data = next(iter(parent.sudo().read(["storage_id"])), {}) + vals["storage_id"] = self._convert_to_write(data).get("storage_id") + # Hack to prevent error related to mail_message parent not exists in some cases + ctx = dict(self.env.context).copy() + ctx.update({"default_parent_id": False}) + self.env.registry.clear_cache() + res = super(DmsDirectory, self.with_context(**ctx)).create(vals_list) + return res + + def write(self, vals): + if any(k in vals.keys() for k in ["storage_id", "parent_id"]): + for item in self: + new_storage_id = vals.get("storage_id", item.storage_id.id) + new_parent_id = vals.get("parent_id", item.parent_id.id) + old_storage_id = ( + item.storage_id or item.root_directory_id.storage_id + ).id + if new_parent_id: + if old_storage_id != self.browse(new_parent_id).storage_id.id: + raise UserError( + _( + "It is not possible to change to a parent " + "with other storage." + ) + ) + elif old_storage_id != new_storage_id: + raise UserError(_("It is not possible to change the storage.")) + # Groups part + if any(key in vals for key in ["group_ids", "inherit_group_ids"]): + res = super().write(vals) + domain = [("id", "child_of", self.ids)] + records = self.sudo().search(domain) + records.modified(["group_ids"]) + records.flush_recordset() + else: + res = super().write(vals) + return res + + @api.depends_context("directory_short_name") + def _compute_display_name(self): + if self.env.context.get("directory_short_name"): + for item in self: + item.display_name = item.name + else: + return super()._compute_display_name() + + def unlink(self): + """Custom cascade unlink. + + Cannot rely on DB backend's cascade because subfolder and subfile unlinks + must check custom permissions implementation. + """ + self.file_ids.unlink() + if self.child_directory_ids: + self.child_directory_ids.unlink() + return super(DmsDirectory, self.exists()).unlink() + + @api.model + def _search_panel_domain_image( + self, field_name, domain, set_count=False, limit=False + ): + """We need to overwrite function from directories because odoo only return + records with children (very weird for user perspective). + All records are returned now. + """ + if field_name == "parent_id": + res = {} + for item in self.search_read( + domain=domain, fields=["id", "name", "count_directories"] + ): + res[item["id"]] = { + "id": item["id"], + "display_name": item["name"], + "__count": item["count_directories"], + } + return res + return super()._search_panel_domain_image( + field_name=field_name, domain=domain, set_count=set_count, limit=limit + ) + + def action_dms_directories_all_directory(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id( + "dms.action_dms_directory" + ) + domain = AND( + [ + literal_eval(action["domain"].strip()), + [("parent_id", "child_of", self.id)], + ] + ) + action["display_name"] = self.name + action["domain"] = domain + action["context"] = dict( + self.env.context, + default_parent_id=self.id, + searchpanel_default_parent_id=self.id, + ) + return action + + def action_dms_files_all_directory(self): + self.ensure_one() + action = self.env["ir.actions.act_window"]._for_xml_id("dms.action_dms_file") + domain = AND( + [ + literal_eval(action["domain"].strip()), + [("directory_id", "child_of", self.id)], + ] + ) + action["display_name"] = self.name + action["domain"] = domain + action["context"] = dict( + self.env.context, + default_directory_id=self.id, + searchpanel_default_directory_id=self.id, + ) + return action diff --git a/dms/models/dms_category.py b/dms/models/dms_category.py new file mode 100644 index 000000000..5900f4d93 --- /dev/null +++ b/dms/models/dms_category.py @@ -0,0 +1,104 @@ +# Copyright 2020 Creu Blanca +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class DMSCategory(models.Model): + _name = "dms.category" + _description = "Document Category" + + _parent_store = True + _parent_name = "parent_id" + + _order = "complete_name asc" + _rec_name = "complete_name" + + name = fields.Char(required=True, translate=True) + active = fields.Boolean( + default=True, + help="The active field allows you to hide the category without removing it.", + ) + complete_name = fields.Char( + compute="_compute_complete_name", store=True, recursive=True + ) + parent_id = fields.Many2one( + string="Parent Category", + comodel_name="dms.category", + ondelete="cascade", + index="btree", + ) + child_category_ids = fields.One2many( + string="Child Categories", + comodel_name="dms.category", + inverse_name="parent_id", + ) + parent_path = fields.Char(index="btree") + tag_ids = fields.One2many( + string="Tags", comodel_name="dms.tag", inverse_name="category_id" + ) + directory_ids = fields.One2many( + string="Directories", + comodel_name="dms.directory", + inverse_name="category_id", + readonly=True, + ) + file_ids = fields.One2many( + string="Files", + comodel_name="dms.file", + inverse_name="category_id", + readonly=True, + ) + count_categories = fields.Integer( + string="Count Subcategories", compute="_compute_count_categories" + ) + count_tags = fields.Integer(compute="_compute_count_tags") + count_directories = fields.Integer(compute="_compute_count_directories") + count_files = fields.Integer(compute="_compute_count_files") + + _sql_constraints = [ + ("name_uniq", "unique (name)", "Category name already exists!"), + ] + + @api.depends("name", "parent_id.complete_name") + def _compute_complete_name(self): + for category in self: + if category.parent_id: + category.complete_name = ( + f"{category.parent_id.complete_name} / {category.name}" + ) + else: + category.complete_name = category.name + + @api.depends("child_category_ids") + def _compute_count_categories(self): + for record in self: + record.count_categories = len(record.child_category_ids) + + @api.depends("tag_ids") + def _compute_count_tags(self): + for record in self: + record.count_tags = len(record.tag_ids) + + @api.depends("directory_ids") + def _compute_count_directories(self): + for record in self: + record.count_directories = len(record.directory_ids) + + @api.depends("file_ids") + def _compute_count_files(self): + for record in self: + record.count_files = len(record.file_ids) + + @api.constrains("parent_id") + def _check_category_recursion(self): + if self._has_cycle(): + raise ValidationError(_("Error! You cannot create recursive categories.")) + return True diff --git a/dms/models/dms_file.py b/dms/models/dms_file.py new file mode 100644 index 000000000..f21e1a367 --- /dev/null +++ b/dms/models/dms_file.py @@ -0,0 +1,668 @@ +# Copyright 2020 Antoni Romera +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2021 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import base64 +import hashlib +import json +import logging +from collections import defaultdict + +from PIL import Image + +from odoo import _, api, fields, models, tools +from odoo.exceptions import UserError, ValidationError +from odoo.osv import expression +from odoo.tools import consteq, human_size +from odoo.tools.mimetypes import guess_mimetype + +from ..tools import file + +_logger = logging.getLogger(__name__) + + +class DMSFile(models.Model): + _name = "dms.file" + _description = "File" + + _inherit = [ + "portal.mixin", + "dms.security.mixin", + "dms.mixins.thumbnail", + "mail.thread", + "mail.activity.mixin", + "abstract.dms.mixin", + ] + + _order = "name asc" + + # Database + active = fields.Boolean( + string="Archived", + default=True, + help="If a file is set to archived, it is not displayed, but still exists.", + ) + directory_id = fields.Many2one( + comodel_name="dms.directory", + string="Directory", + domain="[('permission_create', '=', True)]", + context={"dms_directory_show_path": True}, + ondelete="restrict", + auto_join=True, + required=True, + index="btree", + tracking=True, # Leave log if "moved" to another directory + ) + root_directory_id = fields.Many2one(related="directory_id.root_directory_id") + # Override acording to defined in AbstractDmsMixin + storage_id = fields.Many2one( + related="directory_id.storage_id", + readonly=True, + prefetch=False, + ) + + path_names = fields.Char( + compute="_compute_path", + compute_sudo=True, + readonly=True, + store=False, + ) + + path_json = fields.Text( + compute="_compute_path", + compute_sudo=True, + readonly=True, + store=False, + ) + + tag_ids = fields.Many2many( + comodel_name="dms.tag", + relation="dms_file_tag_rel", + column1="fid", + column2="tid", + domain="['|', ('category_id', '=', False),('category_id', '=?', category_id)]", + string="Tags", + ) + + content = fields.Binary( + compute="_compute_content", + inverse="_inverse_content", + attachment=False, + prefetch=False, + required=True, + store=False, + ) + + extension = fields.Char(compute="_compute_extension", readonly=True, store=True) + + mimetype = fields.Char( + compute="_compute_mimetype", string="Type", readonly=True, store=True + ) + + size = fields.Float(readonly=True) + human_size = fields.Char( + readonly=True, + string="Size (human readable)", + compute="_compute_human_size", + store=True, + ) + + checksum = fields.Char(string="Checksum/SHA1", readonly=True, index="btree") + + content_binary = fields.Binary(attachment=False, prefetch=False) + + save_type = fields.Char( + compute="_compute_save_type", + string="Current Save Type", + prefetch=False, + ) + + migration = fields.Char( + compute="_compute_migration", + string="Migration Status", + readonly=True, + prefetch=False, + compute_sudo=True, + store=True, + ) + require_migration = fields.Boolean( + compute="_compute_migration", store=True, compute_sudo=True + ) + content_file = fields.Binary(attachment=True, prefetch=False) + + # Extend inherited field(s) + image_1920 = fields.Image(compute="_compute_image_1920", store=True, readonly=False) + + @api.depends("mimetype", "content") + def _compute_image_1920(self): + """Provide thumbnail automatically if possible.""" + for one in self.filtered("mimetype"): + # Image.MIME provides a dict of mimetypes supported by Pillow, + # SVG is not present in the dict but is also a supported image format + # lacking a better solution, it's being added manually + # Some component modifies the PIL dictionary by adding PDF as a valid + # image type, so it must be explicitly excluded. + if one.mimetype != "application/pdf" and one.mimetype in ( + *Image.MIME.values(), + "image/svg+xml", + ): + one.image_1920 = one.content + + def check_access(self, operation): + self.mapped("directory_id").check_access(operation) + return super().check_access(operation) + + def _compute_access_url(self): + res = super()._compute_access_url() + for item in self: + item.access_url = f"/my/dms/file/{item.id}/download" + return res + + def check_access_token(self, access_token=False): + if not access_token: + return False + + if self.access_token and consteq(self.access_token, access_token): + return True + + items = ( + self.env["dms.directory"] + .sudo() + .search([("access_token", "=", access_token)]) + ) + if items: + item = items[0] + if self.directory_id.id == item.id: + return True + directory_item = self.directory_id + while directory_item.parent_id: + if directory_item.id == self.directory_id.id: + return True + directory_item = directory_item.parent_id + # Fix last level + if directory_item.id == self.directory_id.id: + return True + return False + + res_model = fields.Char( + string="Linked attachments model", related="directory_id.res_model" + ) + res_id = fields.Integer( + string="Linked attachments record ID", related="directory_id.res_id" + ) + attachment_id = fields.Many2one( + comodel_name="ir.attachment", + string="Attachment File", + prefetch=False, + ondelete="cascade", + index="btree", + ) + + def get_human_size(self): + return human_size(self.size) + + # Helper + @api.model + def _get_checksum(self, binary): + return hashlib.sha1(binary or b"").hexdigest() + + @api.model + def _get_content_inital_vals(self): + return {"content_binary": False, "content_file": False} + + def _update_content_vals(self, vals, binary): + new_vals = vals.copy() + new_vals.update( + { + "checksum": self._get_checksum(binary), + "size": binary and len(binary) or 0, + } + ) + if self.storage_id.save_type in ["file", "attachment"]: + new_vals["content_file"] = self.content + else: + new_vals["content_binary"] = self.content and binary + return new_vals + + @api.model + def _get_binary_max_size(self): + return int( + self.env["ir.config_parameter"] + .sudo() + .get_param("dms.binary_max_size", default=25) + ) + + @api.model + def _get_forbidden_extensions(self): + get_param = self.env["ir.config_parameter"].sudo().get_param + extensions = get_param("dms.forbidden_extensions", default="") + return [extension.strip() for extension in extensions.split(",")] + + def _get_icon_placeholder_name(self): + return self.extension and f"file_{self.extension}.svg" or "" + + # Actions + def action_migrate(self, should_logging=True): + record_count = len(self) + index = 1 + for dms_file in self: + if should_logging: + _logger.info( + _( + "Migrate File %(index)s of %(record_count)s [ %(" + "dms_file_migration)s ]", + index=index, + record_count=record_count, + dms_file_migration=dms_file.migration, + ) + ) + index += 1 + dms_file.write( + { + "content": dms_file.with_context(**{}).content, + "storage_id": dms_file.directory_id.storage_id.id, + } + ) + + def action_save_onboarding_file_step(self): + self.env.user.company_id.set_onboarding_step_done( + "documents_onboarding_file_state" + ) + + def action_wizard_dms_file_move(self): + items = self.browse(self.env.context.get("active_ids")) + root_directories = items.mapped("root_directory_id") + if len(root_directories) > 1: + raise UserError(_("Only files in the same root directory can be moved.")) + result = self.env["ir.actions.act_window"]._for_xml_id( + "dms.wizard_dms_file_move_act_window" + ) + result["context"] = dict(self.env.context) + return result + + # SearchPanel + @api.model + def _search_panel_directory(self, **kwargs): + search_domain = (kwargs.get("search_domain", []),) + category_domain = kwargs.get("category_domain", []) + if category_domain and len(category_domain): + return "=", category_domain[0][2] + if search_domain and len(search_domain): + for domain in search_domain[0]: + if domain[0] == "directory_id": + return domain[1], domain[2] + return None, None + + @api.model + def _search_panel_domain(self, field, operator, directory_id, comodel_domain=False): + if not comodel_domain: + comodel_domain = [] + files_ids = self.search([("directory_id", operator, directory_id)]).ids + return expression.AND([comodel_domain, [(field, "in", files_ids)]]) + + @api.model + def search_panel_select_range(self, field_name, **kwargs): + """This method is overwritten to make it 'similar' to v13. + The goal is that the directory searchpanel shows all directories + (even if some folders have no files). + """ + if field_name != "directory_id": + context = {} + if field_name == "category_id": + context["category_short_name"] = True + return super( + DMSFile, self.with_context(**context) + ).search_panel_select_range(field_name, **kwargs) + + domain = [("is_hidden", "=", False)] + # If we pass by context something, we filter more about it we filter + # the directories of the files, or we show all of them + if self.env.context.get("active_model") == "dms.directory": + active_id = self.env.context.get("active_id") + files = self.env["dms.file"].search( + [("directory_id", "child_of", active_id)] + ) + all_directory_ids = [] + for file_record in files: + directory = file_record.directory_id + while directory: + all_directory_ids.append(directory.id) + directory = directory.parent_id + domain.append(("id", "in", all_directory_ids)) + # Get all possible directories + comodel_records = ( + self.env["dms.directory"] + .with_context(directory_short_name=True) + .search_read(domain, ["display_name", "parent_id"]) + ) + all_record_ids = [rec["id"] for rec in comodel_records] + field_range = {} + enable_counters = kwargs.get("enable_counters") + for record in comodel_records: + record_id = record["id"] + parent = record["parent_id"] + record_values = { + "id": record_id, + "display_name": record["display_name"], + # If the parent directory is not in all the records we should not + # set parent_id because the user does not have access to parent. + "parent_id": ( + parent[0] if parent and parent[0] in all_record_ids else False + ), + } + if enable_counters: + record_values["__count"] = 0 + field_range[record_id] = record_values + if enable_counters: + res = super().search_panel_select_range(field_name, **kwargs) + for item in res["values"]: + if item["id"] in field_range: + field_range[item["id"]]["__count"] = item["__count"] + return {"parent_field": "parent_id", "values": list(field_range.values())} + + @api.model + def search_panel_select_multi_range(self, field_name, **kwargs): + operator, directory_id = self._search_panel_directory(**kwargs) + if field_name == "tag_ids": + sql_query = """ + SELECT t.name AS name, t.id AS id, c.name AS group_name, + c.id AS group_id, COUNT(r.fid) AS count + FROM dms_tag t + JOIN dms_category c ON t.category_id = c.id + LEFT JOIN dms_file_tag_rel r ON t.id = r.tid + WHERE %(filter_by_file_ids)s IS FALSE OR r.fid = ANY(%(file_ids)s) + GROUP BY c.name, c.id, t.name, t.id + ORDER BY c.name, c.id, t.name, t.id; + """ + file_ids = [] + if directory_id: + file_ids = self.search([("directory_id", operator, directory_id)]).ids + self.env.cr.execute( + sql_query, + {"file_ids": file_ids, "filter_by_file_ids": bool(directory_id)}, + ) + return self.env.cr.dictfetchall() + if directory_id and field_name in ["directory_id", "category_id"]: + comodel_domain = kwargs.pop("comodel_domain", []) + directory_comodel_domain = self._search_panel_domain( + "file_ids", operator, directory_id, comodel_domain + ) + return super( + DMSFile, self.with_context(directory_short_name=True) + ).search_panel_select_multi_range( + field_name, comodel_domain=directory_comodel_domain, **kwargs + ) + return super( + DMSFile, self.with_context(directory_short_name=True) + ).search_panel_select_multi_range(field_name, **kwargs) + + # Read + @api.depends("name", "directory_id", "directory_id.parent_path") + def _compute_path(self): + model = self.env["dms.directory"] + for record in self: + path_names = [record.display_name] + path_json = [ + { + "model": record._name, + "name": record.display_name, + "id": isinstance(record.id, int) and record.id or 0, + } + ] + current_dir = record.directory_id + while current_dir: + path_names.insert(0, current_dir.name) + path_json.insert( + 0, + { + "model": model._name, + "name": current_dir.name, + "id": current_dir._origin.id, + }, + ) + current_dir = current_dir.parent_id + record.update( + { + "path_names": "/".join(path_names) if all(path_names) else "", + "path_json": json.dumps(path_json), + } + ) + + @api.depends("name", "mimetype", "content") + def _compute_extension(self): + for record in self: + record.extension = file.guess_extension( + record.name, record.mimetype, record.content + ) + + @api.depends("content") + def _compute_mimetype(self): + for record in self: + binary = base64.b64decode(record.content or "") + record.mimetype = guess_mimetype(binary) + + @api.depends("size") + def _compute_human_size(self): + for item in self: + item.human_size = human_size(item.size) + + @api.depends("content_binary", "content_file", "attachment_id") + def _compute_content(self): + bin_size = self.env.context.get("bin_size", False) + for record in self: + if record.content_file: + context = {"human_size": True} if bin_size else {"base64": True} + record.content = record.with_context(**context).content_file + elif record.content_binary: + record.content = ( + record.content_binary + if bin_size + else base64.b64encode(record.content_binary) + ) + elif record.attachment_id: + context = {"human_size": True} if bin_size else {"base64": True} + record.content = record.with_context(**context).attachment_id.datas + + @api.depends("content_binary", "content_file") + def _compute_save_type(self): + for record in self: + if record.content_file: + record.save_type = "file" + else: + record.save_type = "database" + + @api.depends("storage_id", "storage_id.save_type") + def _compute_migration(self): + storage_model = self.env["dms.storage"] + save_field = storage_model._fields["save_type"] + values = save_field._description_selection(self.env) + selection = {value[0]: value[1] for value in values} + for record in self: + storage_type = record.storage_id.save_type + if storage_type == "attachment" or storage_type == record.save_type: + record.migration = selection.get(storage_type) + record.require_migration = False + else: + storage_label = selection.get(storage_type) + file_label = selection.get(record.save_type) + record.migration = f"{file_label} > {storage_label}" + record.require_migration = True + + # View + @api.onchange("category_id") + def _change_category(self): + self.tag_ids = self.tag_ids.filtered( + lambda rec: not rec.category_id or rec.category_id == self.category_id + ) + + # Constrains + @api.constrains("storage_id", "res_model", "res_id") + def _check_storage_id_attachment_res_model(self): + for record in self: + if record.storage_id.save_type == "attachment" and not ( + record.res_model and record.res_id + ): + raise ValidationError( + _("A file must have model and resource ID in attachment storage.") + ) + + @api.constrains("name") + def _check_name(self): + for record in self: + if not file.check_name(record.name): + raise ValidationError(_("The file name is invalid.")) + files = record.sudo().directory_id.file_ids + if files.filtered( + lambda file, record=record: file.name == record.name and file != record + ): + raise ValidationError( + _("A file with the same name already exists in this directory.") + ) + + @api.constrains("extension") + def _check_extension(self): + if self.filtered( + lambda rec: rec.extension + and rec.extension in self._get_forbidden_extensions() + ): + raise ValidationError(_("The file has a forbidden file extension.")) + + @api.constrains("size") + def _check_size(self): + if self.filtered( + lambda rec: rec.size > self._get_binary_max_size() * 1024 * 1024 + ): + raise ValidationError( + _("The maximum upload size is %s MB.") % self._get_binary_max_size() + ) + + # Create, Update, Delete + def _inverse_content(self): + updates = defaultdict(set) + for record in self: + values = self._get_content_inital_vals() + binary = base64.b64decode(record.content or "") + values = record._update_content_vals(values, binary) + updates[tools.frozendict(values)].add(record.id) + for vals, ids in updates.items(): + self.browse(ids).write(dict(vals)) + + def _create_model_attachment(self, vals): + res_vals = vals.copy() + directory_id = False + if "directory_id" in res_vals: + directory_id = res_vals["directory_id"] + elif self.env.context.get("active_id"): + directory_id = self.env.context.get("active_id") + elif self.env.context.get("default_directory_id"): + directory_id = self.env.context.get("default_directory_id") + directory = self.env["dms.directory"].browse(directory_id) + if ( + directory.res_model + and directory.res_id + and directory.storage_id_save_type == "attachment" + ): + attachment = ( + self.env["ir.attachment"] + .with_context(dms_file=True) + .create( + { + "name": vals["name"], + "datas": vals["content"], + "res_model": directory.res_model, + "res_id": directory.res_id, + } + ) + ) + res_vals["attachment_id"] = attachment.id + res_vals["res_model"] = attachment.res_model + res_vals["res_id"] = attachment.res_id + del res_vals["content"] + return res_vals + + def copy_data(self, default=None): + vals_list = super().copy_data(default) + for dms_file, vals in zip(self, vals_list, strict=False): + if vals.get("directory_id"): + directory = self.env["dms.directory"].browse(vals.get("directory_id")) + names = directory.sudo().file_ids.mapped("name") + else: + names = dms_file.sudo().directory_id.file_ids.mapped("name") + vals["name"] = file.unique_name(dms_file.name, names, dms_file.extension) + return vals_list + + @api.model_create_multi + def create(self, vals_list): + new_vals_list = [] + for vals in vals_list: + if "attachment_id" not in vals: + vals = self._create_model_attachment(vals) + new_vals_list.append(vals) + return super().create(new_vals_list) + + def unlink(self): + attachments = self.mapped("attachment_id") + res = super().unlink() + if not self.env.context.get("dms_file"): + attachments.with_context(dms_file=True).unlink() + return res + + # ---------------------------------------------------------- + # Locking fields and functions + locked_by = fields.Many2one(comodel_name="res.users") + + is_locked = fields.Boolean(compute="_compute_locked", string="Locked") + + is_lock_editor = fields.Boolean(compute="_compute_locked", string="Editor") + + # ---------------------------------------------------------- + # Locking + # ---------------------------------------------------------- + + def lock(self): + self.write({"locked_by": self.env.uid}) + + def unlock(self): + self.write({"locked_by": None}) + + # Read, View + @api.depends("locked_by") + def _compute_locked(self): + for record in self: + if record.locked_by.exists(): + record.update( + { + "is_locked": True, + "is_lock_editor": record.locked_by.id == record.env.uid, + } + ) + else: + record.update({"is_locked": False, "is_lock_editor": False}) + + def get_attachment_object(self, attachment): + return { + "name": attachment.name, + "datas": attachment.datas, + "res_model": attachment.res_model, + "mimetype": attachment.mimetype, + } + + @api.model + def get_dms_files_from_attachments(self, attachment_ids=None): + """Get the dms files from uploaded attachments. + :return: An Array of dms files. + """ + if not attachment_ids: + raise UserError(_("No attachment was provided")) + + attachments = self.env["ir.attachment"].browse(attachment_ids) + + if any( + attachment.res_id or attachment.res_model != "dms.file" + for attachment in attachments + ): + raise UserError(_("Invalid attachments!")) + + return [self.get_attachment_object(attachment) for attachment in attachments] diff --git a/dms/models/dms_security_mixin.py b/dms/models/dms_security_mixin.py new file mode 100644 index 000000000..fb96ec0c3 --- /dev/null +++ b/dms/models/dms_security_mixin.py @@ -0,0 +1,308 @@ +# Copyright 2020 Creu Blanca +# Copyright 2021-2025 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from logging import getLogger + +from odoo import api, fields, models +from odoo.exceptions import AccessError +from odoo.osv.expression import ( + FALSE_DOMAIN, + NEGATIVE_TERM_OPERATORS, + OR, + TRUE_DOMAIN, +) +from odoo.tools import SQL + +_logger = getLogger(__name__) + + +class DmsSecurityMixin(models.AbstractModel): + _name = "dms.security.mixin" + _description = "DMS Security Mixin" + + # Submodels must define this field that points to the owner dms.directory + _directory_field = "directory_id" + + res_model = fields.Char( + string="Linked attachments model", index="btree", store=True + ) + res_id = fields.Integer( + string="Linked attachments record ID", index="btree", store=True + ) + record_ref = fields.Reference( + string="Record Referenced", + compute="_compute_record_ref", + selection=lambda self: self._get_ref_selection(), + ) + permission_read = fields.Boolean( + compute="_compute_permissions", + search="_search_permission_read", + string="Read Access", + ) + permission_create = fields.Boolean( + compute="_compute_permissions", + search="_search_permission_create", + string="Create Access", + ) + permission_write = fields.Boolean( + compute="_compute_permissions", + search="_search_permission_write", + string="Write Access", + ) + permission_unlink = fields.Boolean( + compute="_compute_permissions", + search="_search_permission_unlink", + string="Delete Access", + ) + + @api.model + def _get_ref_selection(self): + models = self.env["ir.model"].sudo().search([]) + return [(model.model, model.name) for model in models] + + @api.depends("res_model", "res_id") + def _compute_record_ref(self): + for record in self: + record.record_ref = False + if record.res_model and record.res_id: + record.record_ref = f"{record.res_model},{record.res_id}" + + def _compute_permissions(self): + """ + Get permissions for the current record. + """ + + # Update according to presence when applying ir.rule + self.invalidate_recordset() + if self.env.su: + self.update( + { + "permission_create": True, + "permission_read": True, + "permission_unlink": True, + "permission_write": True, + } + ) + return + + creatable = self._filtered_access("create") + readable = self._filtered_access("read") + unlinkable = self._filtered_access("unlink") + writeable = self._filtered_access("write") + for one in self: + one.update( + { + "permission_create": bool(one & creatable), + "permission_read": bool(one & readable), + "permission_unlink": bool(one & unlinkable), + "permission_write": bool(one & writeable), + } + ) + + @api.model + def _get_domain_by_inheritance(self, operation): + """Get domain for inherited accessible records.""" + if self.env.su: + return [] + inherited_access_field = "storage_id_inherit_access_from_parent_record" + if self._name != "dms.directory": + inherited_access_field = f"{self._directory_field}.{inherited_access_field}" + inherited_access_domain = [ + ("storage_id_save_type", "=", "attachment"), + (inherited_access_field, "=", True), + ] + domains = [] + # Get all used related records + related_groups = self.sudo().read_group( + domain=inherited_access_domain + [("res_model", "!=", False)], + fields=["res_id:array_agg"], + groupby=["res_model"], + ) + for group in related_groups: + try: + model = self.env[group["res_model"]] + except KeyError: + # The model might not be registered. + # This is normal if you are upgrading the database. + # Otherwise, you probably have garbage DMS data. + # These records will be accessible by DB users only. + domains.append( + [ + ("res_model", "=", group["res_model"]), + (True, "=", self.env.user.has_group("base.group_user")), + ] + ) + continue + # Check model access only once per batch + try: + model.check_access(operation) + except AccessError: + continue + domains.append([("res_model", "=", model._name), ("res_id", "=", False)]) + # Check record access in batch too + res_ids = [i for i in group["res_id"] if i] # Hack to remove None res_id + # Apply exists to skip records that do not exist. (e.g. a res.partner + # deleted by database). + model_records = model.browse(res_ids).exists() + related_ok = model_records._filtered_access(operation) + if not related_ok: + continue + domains.append( + [("res_model", "=", model._name), ("res_id", "in", related_ok.ids)] + ) + result = inherited_access_domain + OR(domains) + return result + + @api.model + def _get_access_groups_query(self, operation): + """Return the query to select access groups.""" + operation_check = { + "create": "AND dag.perm_inclusive_create", + "read": "", + "unlink": "AND dag.perm_inclusive_unlink", + "write": "AND dag.perm_inclusive_write", + }[operation] + select = f"""( + SELECT + dir_group_rel.aid + FROM + dms_directory_complete_groups_rel AS dir_group_rel + INNER JOIN dms_access_group AS dag + ON dir_group_rel.gid = dag.id + INNER JOIN dms_access_group_users_rel AS users + ON users.gid = dag.id + WHERE + users.uid = %s {operation_check} + )""" + sql = SQL( + select, + self.env.uid, + ) + return sql + + @api.model + def _get_domain_by_access_groups(self, operation): + """Get domain for records accessible applying DMS access groups.""" + result = [ + ( + f"{self._directory_field}.storage_id_inherit_access_from_parent_record", + "=", + False, + ), + ( + self._directory_field, + "in", + self._get_access_groups_query(operation), + ), + ] + return result + + @api.model + def _get_permission_domain(self, operator, value, operation): + """Abstract logic for searching computed permission fields.""" + _self = self + # HACK ir.rule domain is always computed with sudo, so if this check is + # true, we can assume safely that you're checking permissions + if self.env.su and value == self.env.uid: + _self = self.sudo(False) + value = bool(value) + # Tricky one, to know if you want to search + # positive or negative access + positive = (operator not in NEGATIVE_TERM_OPERATORS) == bool(value) + if _self.env.su: + # You're SUPERUSER_ID + return TRUE_DOMAIN if positive else FALSE_DOMAIN + + result = OR( + [ + _self._get_domain_by_access_groups(operation), + _self._get_domain_by_inheritance(operation), + ] + ) + if not positive: + result.insert(0, "!") + return result + + @api.model + def _search_permission_create(self, operator, value): + return self._get_permission_domain(operator, value, "create") + + @api.model + def _search_permission_read(self, operator, value): + return self._get_permission_domain(operator, value, "read") + + @api.model + def _search_permission_unlink(self, operator, value): + return self._get_permission_domain(operator, value, "unlink") + + @api.model + def _search_permission_write(self, operator, value): + return self._get_permission_domain(operator, value, "write") + + def filtered_domain(self, domain): + """This method is needed to inhibit the behavior when called from the + _check_access() method with sudo() https://github.com/odoo/odoo/blob/fc737a147b9aefbd6ae5d111835ce3f4f7b4240a/odoo/models.py#L4465. + It would cause the error that multiple records are not accessed to be + displayed. + The _filtered_access() method is also overwritten to prevent this sudo() + specific behavior and to be able to access only the appropriate records. + """ + if self.env.su: + return self + return super().filtered_domain(domain) + + def _filtered_access_no_recursion(self, operation: str): + """This method is just the same as _filtered_access + but it can not be called withoud super due to + recursion error. + """ + if self and not self.env.su and (result := self._check_access(operation)): + return self - result[0] + return self + + def _filtered_access(self, operation): + # Only kept to not break inheritance; see next comment + result = super()._filtered_access(operation) + # HACK Always fall back to applying rules by SQL. + # Upstream `_filtered_access()` doesn't use computed fields + # search methods. Thus, it will take the `[('permission_{operation}', + # '=', user.id)]` rule literally. Obviously that will always fail + # because `self[f"permission_{operation}"]` will always be a `bool`, + # while `user.id` will always be an `int`. + result |= self._filtered_access_no_recursion(operation) + return result + + def _check_access_dms_record(self, operation: str) -> tuple | None: + """Specific method "similar" to _check_access() but with a different + behavior: check if you do not really have access to any of the records + in to avoid performing the corresponding create/write/unlink action.""" + if any(self._ids) and not self.env.su: + Rule = self.env["ir.rule"] + domain = Rule._compute_domain(self._name, operation) + items = self.search(domain) + if any(x_id not in items.ids for x_id in self.ids): + raise Rule._make_access_error(operation, (self - items)) + + @api.model_create_multi + def create(self, vals_list): + # Create as sudo to avoid testing creation permissions before DMS security + # groups are attached (otherwise nobody would be able to create) + res = super(DmsSecurityMixin, self.sudo()).create(vals_list) + # Need to flush now, so all groups are stored in DB and the SELECT used + # to check access works + res.flush_recordset() + # Go back to the original sudo state and check we really had creation permission + res = res.sudo(self.env.su) + res._check_access_dms_record("create") + return res + + def write(self, vals): + self._check_access_dms_record("write") + return super().write(vals) + + def unlink(self): + self._check_access_dms_record("unlink") + return super().unlink() diff --git a/dms/models/ir_attachment.py b/dms/models/ir_attachment.py new file mode 100644 index 000000000..52117ef32 --- /dev/null +++ b/dms/models/ir_attachment.py @@ -0,0 +1,108 @@ +# Copyright 2021-2025 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import api, models +from odoo.tools import ormcache + + +class IrAttachment(models.Model): + _inherit = "ir.attachment" + + def _get_dms_directories(self, res_model, res_id): + domain = [ + ("res_model", "=", res_model), + ("res_id", "=", res_id), + ("storage_id.save_type", "=", "attachment"), + ] + if self.env.context.get("attaching_to_record"): + domain += [("storage_id.include_message_attachments", "=", True)] + return self.env["dms.directory"].search(domain) + + def _dms_directories_create(self): + items = self.sudo()._get_dms_directories(self.res_model, False) + for item in items: + model_item = self.env[self.res_model].browse(self.res_id) + ir_model_item = ( + self.env["ir.model"].sudo().search([("model", "=", self.res_model)]) + ) + self.env["dms.directory"].sudo().with_context(check_name=False).create( + { + "name": model_item.display_name, + "model_id": ir_model_item.id, + "res_model": self.res_model, + "res_id": self.res_id, + "parent_id": item.id, + "storage_id": item.storage_id.id, + } + ) + + @ormcache("model") + def _dms_operations_from_model(self, model): + # Apply sudo to prevent ir.rule from being applied. + item = self.env["dms.storage"].sudo().search([("model_ids.model", "=", model)]) + return bool(item) + + def _dms_operations(self): + """Perform the operation only if there is a storage with linked models. + The directory (dms.directory) linked to the record (if it does not exist) + and the file (dms.file) with the linked attachment would be created. + """ + for attachment in self: + if ( + not attachment.res_model + or not attachment.res_id + or ( + attachment.res_model + and not self._dms_operations_from_model(attachment.res_model) + ) + ): + continue + directories = attachment._get_dms_directories( + attachment.res_model, attachment.res_id + ) + if not directories: + attachment._dms_directories_create() + # Get dms_directories again (with items previously created) + directories = attachment._get_dms_directories( + attachment.res_model, attachment.res_id + ) + # Auto-create_files (if not exists) + for directory in directories: + dms_file_model = self.env["dms.file"].sudo() + dms_file = dms_file_model.search( + [ + ("attachment_id", "=", attachment.id), + ("directory_id", "=", directory.id), + ] + ) + if not dms_file: + dms_file_model.create( + { + "name": attachment.name, + "directory_id": directory.id, + "attachment_id": attachment.id, + "res_model": attachment.res_model, + "res_id": attachment.res_id, + } + ) + + @api.model_create_multi + def create(self, vals_list): + records = super().create(vals_list) + if not self.env.context.get("dms_file"): + records._dms_operations() + return records + + def write(self, vals): + res = super().write(vals) + if not self.env.context.get("dms_file") and self.env.context.get( + "attaching_to_record" + ): + self._dms_operations() + return res + + def unlink(self): + if not self.env.context.get("dms_file"): + self.env["dms.file"].search( + [("attachment_id", "in", self.ids)] + ).with_context(dms_file=True).unlink() + return super().unlink() diff --git a/dms/models/ir_binary.py b/dms/models/ir_binary.py new file mode 100644 index 000000000..79ebcb48a --- /dev/null +++ b/dms/models/ir_binary.py @@ -0,0 +1,19 @@ +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import models + + +class IrBinary(models.AbstractModel): + _inherit = "ir.binary" + + def _find_record_check_access(self, record, access_token, field): + if record._name in ("dms.file", "dms.directory"): + if record.sudo().check_access_token(access_token): + # sudo because the user might not usually have access to the record but + # now the token is valid. + # Used to display the icon in the portal. + return record.sudo() + + return super()._find_record_check_access(record, access_token, field) diff --git a/dms/models/mail_thread.py b/dms/models/mail_thread.py new file mode 100644 index 000000000..4e6514d7d --- /dev/null +++ b/dms/models/mail_thread.py @@ -0,0 +1,15 @@ +# Copyright 2021 Tecnativa - Jairo Llopis +# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl). + +from odoo import models + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def _process_attachments_for_post(self, attachments, attachment_ids, message_data): + """Indicate to DMS that we're attaching a message to a record.""" + _self = self.with_context(attaching_to_record=True) + return super(MailThread, _self)._process_attachments_for_post( + attachments, attachment_ids, message_data + ) diff --git a/dms/models/mixins_thumbnail.py b/dms/models/mixins_thumbnail.py new file mode 100644 index 000000000..ebaed83d6 --- /dev/null +++ b/dms/models/mixins_thumbnail.py @@ -0,0 +1,49 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import os + +from odoo import api, fields, models +from odoo.tools.misc import file_path + + +class Thumbnail(models.AbstractModel): + _name = "dms.mixins.thumbnail" + _inherit = "image.mixin" + _description = "DMS thumbnail and icon mixin" + + icon_url = fields.Char(string="Icon URL", compute="_compute_icon_url") + + def _get_icon_disk_path(self): + """Get the local disk path to record icon.""" + name = self._get_icon_placeholder_name() + folders = ["dms", "static", "icons"] + + try: + path = file_path(os.path.join(*folders, name)) + except FileNotFoundError: + return file_path(os.path.join(*folders, "file_unknown.svg")) + + return path or file_path(os.path.join(*folders, "file_unknown.svg")) + + def _get_icon_placeholder_name(self): + return "folder.svg" + + def _get_icon_url(self): + """Obtain URL to record icon.""" + local_path = self._get_icon_disk_path() + icon_name = os.path.basename(local_path) + return f"/dms/static/icons/{icon_name}" + + @api.depends("image_128") + def _compute_icon_url(self): + """Get icon static file URL.""" + for one in self: + # Get URL to thumbnail or to the default icon by file extension + one.icon_url = ( + f"/web/image/{one._name}/{one.id}/image_128/128x128?crop=1" + if one.image_128 + else f"{one._get_icon_url()}?crop=1" + ) diff --git a/dms/models/onboarding_onboarding.py b/dms/models/onboarding_onboarding.py new file mode 100644 index 000000000..803d9e9b0 --- /dev/null +++ b/dms/models/onboarding_onboarding.py @@ -0,0 +1,16 @@ +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import api, models + + +class OnboardingOnboarding(models.Model): + _inherit = "onboarding.onboarding" + + # ---------------------------------------------------------- + # Actions + # ---------------------------------------------------------- + @api.model + def action_close_panel_dms_file(self): + self.action_close_panel("dms.onboarding_onboarding_dms_file") diff --git a/dms/models/onboarding_onboarding_step.py b/dms/models/onboarding_onboarding_step.py new file mode 100644 index 000000000..3345bb356 --- /dev/null +++ b/dms/models/onboarding_onboarding_step.py @@ -0,0 +1,50 @@ +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + + +from odoo import api, models + + +class OnboardingOnboardingStep(models.Model): + _inherit = "onboarding.onboarding.step" + + # ---------------------------------------------------------- + # Actions + # ---------------------------------------------------------- + @api.model + def action_open_documents_onboarding_storage(self): + """ + Open the form to create a new storage from the onboarding panel. + """ + return self.env.ref("dms.action_dms_storage_new").read()[0] + + @api.model + def action_open_documents_onboarding_directory(self): + """ + Open the form to create a new directory from the onboarding panel. + """ + storage = self.env["dms.storage"].search([], order="create_date desc", limit=1) + action = self.env.ref("dms.action_dms_directory_new").read()[0] + action["context"] = { + **self.env.context, + **{ + "default_is_root_directory": True, + "default_storage_id": storage and storage.id, + }, + } + return action + + @api.model + def action_open_documents_onboarding_file(self): + """ + Open the form to create a new file from the onboarding panel. + """ + directory = self.env["dms.directory"].search( + [], order="create_date desc", limit=1 + ) + action = self.env.ref("dms.action_dms_file_new").read()[0] + action["context"] = { + **self.env.context, + **{"default_directory_id": directory and directory.id}, + } + return action diff --git a/dms/models/res_company.py b/dms/models/res_company.py new file mode 100644 index 000000000..0262a3bd2 --- /dev/null +++ b/dms/models/res_company.py @@ -0,0 +1,86 @@ +# Copyright 2020 Creu Blanca +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import api, fields, models + +_logger = logging.getLogger(__name__) + + +class ResCompany(models.Model): + _inherit = "res.company" + + documents_onboarding_state = fields.Selection( + selection=[ + ("not_done", "Not done"), + ("just_done", "Just done"), + ("done", "Done"), + ("closed", "Closed"), + ], + default="not_done", + ) + documents_onboarding_storage_state = fields.Selection( + selection=[ + ("not_done", "Not done"), + ("just_done", "Just done"), + ("done", "Done"), + ("closed", "Closed"), + ], + default="not_done", + ) + documents_onboarding_directory_state = fields.Selection( + selection=[ + ("not_done", "Not done"), + ("just_done", "Just done"), + ("done", "Done"), + ("closed", "Closed"), + ], + default="not_done", + ) + documents_onboarding_file_state = fields.Selection( + selection=[ + ("not_done", "Not done"), + ("just_done", "Just done"), + ("done", "Done"), + ("closed", "Closed"), + ], + default="not_done", + ) + + # Functions + def get_and_update_documents_onboarding_state(self): + step_states = [ + "documents_onboarding_storage_state", + "documents_onboarding_directory_state", + "documents_onboarding_file_state", + ] + onboarding_state = "documents_onboarding_state" + old_values = {} + all_done = True + + for step_state in step_states: + old_values[step_state] = self[step_state] + if self[step_state] == "just_done": + self[step_state] = "done" + all_done = all_done and self[step_state] == "done" + + if all_done: + old_values[onboarding_state] = ( + "just_done" if self[onboarding_state] == "not_done" else "done" + ) + self[onboarding_state] = "done" + + return old_values + + # Actions + @api.model + def action_close_documents_onboarding(self): + self.env.user.company_id.documents_onboarding_state = "closed" + + def set_onboarding_step_done(self, step): + self.ensure_one() + if self[step] == "not_done": + self[step] = "just_done" diff --git a/dms/models/res_config_settings.py b/dms/models/res_config_settings.py new file mode 100644 index 000000000..e1e00fc97 --- /dev/null +++ b/dms/models/res_config_settings.py @@ -0,0 +1,21 @@ +# Copyright 2020 Creu Blanca +# Copyright 2017-2019 MuK IT GmbH +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + documents_binary_max_size = fields.Integer( + string="Size", + help="Defines the maximum upload size in MB. Default (25MB)", + config_parameter="dms.binary_max_size", + ) + + documents_forbidden_extensions = fields.Char( + string="Extensions", + help="Defines a list of forbidden file extensions. (Example: 'exe,msi')", + config_parameter="dms.forbidden_extensions", + ) diff --git a/dms/models/res_users.py b/dms/models/res_users.py new file mode 100644 index 000000000..a3df5f432 --- /dev/null +++ b/dms/models/res_users.py @@ -0,0 +1,36 @@ +from odoo import models, fields, api + +class ResUsers(models.Model): + _inherit = 'res.users' + + dms_role = fields.Selection([ + ('none', 'None'), + ('viewer', 'Viewer'), + ('editor', 'Editor'), + ('admin', 'Administrator'), + ], string='DMS Role', default='none', compute='_compute_dms_role', inverse='_inverse_dms_role') + + def _compute_dms_role(self): + for user in self: + if user.has_group('dms.group_dms_manager'): + user.dms_role = 'admin' + elif user.has_group('dms.group_dms_user'): + user.dms_role = 'editor' + elif user.has_group('dms.group_dms_viewer'): + user.dms_role = 'viewer' + else: + user.dms_role = 'none' + + def _inverse_dms_role(self): + for user in self: + viewer = self.env.ref('dms.group_dms_viewer') + editor = self.env.ref('dms.group_dms_user') + admin = self.env.ref('dms.group_dms_manager') + groups = viewer | editor | admin + user.groups_id -= groups + if user.dms_role == 'viewer': + user.groups_id += viewer + elif user.dms_role == 'editor': + user.groups_id += editor + elif user.dms_role == 'admin': + user.groups_id += admin diff --git a/dms/models/storage.py b/dms/models/storage.py new file mode 100644 index 000000000..cbc74cf01 --- /dev/null +++ b/dms/models/storage.py @@ -0,0 +1,133 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import _, api, fields, models +from odoo.exceptions import AccessError + +_logger = logging.getLogger(__name__) + + +class Storage(models.Model): + _name = "dms.storage" + _description = "Storage" + + name = fields.Char(required=True) + save_type = fields.Selection( + selection=[ + ("database", "Database"), + ("file", "Filestore"), + ("attachment", "Attachment"), + ], + default="database", + required=True, + help="The save type is used to determine how a file is saved by the system. " + "If you change this setting, you can migrate existing files manually by " + "triggering the action.", + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + help="If set, directories and files will only be available for " + "the selected company.", + ) + is_hidden = fields.Boolean( + string="Storage is Hidden", + default=False, + help="Indicates if directories and files are hidden by default.", + ) + root_directory_ids = fields.One2many( + comodel_name="dms.directory", + inverse_name="storage_id", + string="Root Directories", + auto_join=False, + readonly=False, + copy=False, + ) + storage_directory_ids = fields.One2many( + comodel_name="dms.directory", + inverse_name="storage_id", + string="Directories", + auto_join=False, + readonly=True, + copy=False, + ) + storage_file_ids = fields.One2many( + comodel_name="dms.file", + inverse_name="storage_id", + string="Files", + auto_join=False, + readonly=True, + copy=False, + ) + count_storage_directories = fields.Integer( + compute="_compute_count_storage_directories", string="Count Directories" + ) + count_storage_files = fields.Integer( + compute="_compute_count_storage_files", string="Count Files" + ) + model_ids = fields.Many2many("ir.model", string="Linked Models") + inherit_access_from_parent_record = fields.Boolean( + string="Inherit permissions from related record", + default=False, + help="Indicate if directories and files access work only with " + "related model access (for example, if some directories are related " + "with any sale, only users with read access to these sale can access)", + ) + include_message_attachments = fields.Boolean( + string="Create files from message attachments", + default=False, + help="Indicate if directories and files auto-create in mail " + "composition process too", + ) + model = fields.Char(search="_search_model", store=False) + + def _search_model(self, operator, value): + allowed_items = self.env["ir.model"].sudo().search([("model", operator, value)]) + return [("model_ids", "in", allowed_items.ids)] + + @api.onchange("save_type") + def _onchange_save_type(self): + for record in self: + if record.save_type == "attachment": + record.inherit_access_from_parent_record = True + + # Actions + def action_storage_migrate(self): + if self.save_type != "attachment": + if not self.env.user.has_group("dms.group_dms_manager"): + raise AccessError(_("Only managers can execute this action.")) + files = self.env["dms.file"].with_context(active_test=False).sudo() + + for record in self: + domain = [ + ("require_migration", "=", True), + ("storage_id", "=", record.id), + ] + files.search(domain).action_migrate() + + def action_save_onboarding_storage_step(self): + self.env.user.company_id.set_onboarding_step_done( + "documents_onboarding_storage_state" + ) + + # Read, View + @api.depends("storage_directory_ids") + def _compute_count_storage_directories(self): + for record in self: + record.count_storage_directories = len(record.storage_directory_ids) + + @api.depends("storage_file_ids") + def _compute_count_storage_files(self): + for record in self: + record.count_storage_files = len(record.storage_file_ids) + + def write(self, values): + res = super().write(values) + if "model_ids" in values: + self.env.registry.clear_cache() + return res diff --git a/dms/models/tag.py b/dms/models/tag.py new file mode 100644 index 000000000..25dfb9a57 --- /dev/null +++ b/dms/models/tag.py @@ -0,0 +1,59 @@ +# Copyright 2020 RGB Consulting +# Copyright 2017-2019 MuK IT GmbH +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import logging + +from odoo import api, fields, models + +_logger = logging.getLogger(__name__) + + +class Tag(models.Model): + _name = "dms.tag" + _description = "Document Tag" + + name = fields.Char(required=True, translate=True) + active = fields.Boolean( + default=True, + help="The active field allows you " "to hide the tag without removing it.", + ) + category_id = fields.Many2one( + comodel_name="dms.category", + context={"dms_category_show_path": True}, + string="Category", + ondelete="set null", + ) + color = fields.Integer(string="Color Index", default=10) + directory_ids = fields.Many2many( + comodel_name="dms.directory", + relation="dms_directory_tag_rel", + column1="tid", + column2="did", + string="Directories", + readonly=True, + ) + file_ids = fields.Many2many( + comodel_name="dms.file", + relation="dms_file_tag_rel", + column1="tid", + column2="fid", + string="Files", + readonly=True, + ) + count_directories = fields.Integer(compute="_compute_count_directories") + count_files = fields.Integer(compute="_compute_count_files") + + _sql_constraints = [ + ("name_uniq", "unique (name, category_id)", "Tag name already exists!"), + ] + + @api.depends("directory_ids") + def _compute_count_directories(self): + for rec in self: + rec.count_directories = len(rec.directory_ids) + + @api.depends("file_ids") + def _compute_count_files(self): + for rec in self: + rec.count_files = len(rec.file_ids) diff --git a/dms/pyproject.toml b/dms/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/dms/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/dms/readme/CONFIGURE.md b/dms/readme/CONFIGURE.md new file mode 100644 index 000000000..7443be667 --- /dev/null +++ b/dms/readme/CONFIGURE.md @@ -0,0 +1,59 @@ +# Configuration + +To configure this module, you need to: + +## 1. Create a storage +1. Go to *Documents -\> Configuration -\> Storages*. + +2. Create a new document storage. You can choose between three options on `Save Type`: + - `Database`: Store the files on the database as a field + - `Attachment`: Store the files as attachments + - `File`: Store the files on the file system + +## 2. Create an access group +1. Next, create an administrative access group. Go to *Configuration -\> Access Groups*. + - Create a new group, name it appropriately, and turn on all three + permissions (Create, Write and Unlink. Read is implied and always + enabled). + - Add any other top-level administrative users to the group if + needed (your user should already be there). + - You can create other groups in here later for fine-grained access + control. + +## 3. Create a directory +1. Afterward, go to *Documents -\> Directories*. + +2. Create a new directory, mark it as root and select the previously created setting. + - Select the *Groups* tab and add your administrative group created + above. + If your directory was already created before the group, you can also add it in the + access groups (*Configuration -\> Access Groups*). + +3. In the directory settings, you can also add other access groups (created above) that will be able to: + - read + - create + - write + - delete + +# Migration + +If you need to modify the storage `Save Type` you might want to migrate +the file data. To achieve it, you need to: + +1. Go to *Documents -\> Configuration -\> Storage* and select the + storage you want to modify +2. Modify the save type +3. Press the button Migrate files if you want to migrate all the files + at once +4. Press the button Manual File Migration to specify files one by one + +You can check all the files that still need to be migrated from all +storages and migrate them manually on *Documents -\> Configuration -\> +Migration* + +# File Wizard Selection + +There is an action called `action_dms_file_wizard_selector` to open a +wizard to list files in kanban view. This can be used (example +dms_attachment_link module) to add a button in kanban view with the +action we need. diff --git a/dms/readme/CONTRIBUTORS.md b/dms/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..a319c249a --- /dev/null +++ b/dms/readme/CONTRIBUTORS.md @@ -0,0 +1,16 @@ +- Mathias Markl \<\> +- Enric Tobella \<\> +- Antoni Romera +- Gelu Boros \<\> +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza + - Jairo Llopis +- [Elego](https://www.elegosoft.com): + - Yu Weng \<\> + - Philip Witte \<\> + - Khanh Bui \<\> +- [Subteno](https://www.subteno.com): + - Timothée Vannier <> +- [Kencove](https://www.kencove.com): + - Mohamed Alkobrosli <> diff --git a/dms/readme/CREDITS.md b/dms/readme/CREDITS.md new file mode 100644 index 000000000..a1fe32cc7 --- /dev/null +++ b/dms/readme/CREDITS.md @@ -0,0 +1,6 @@ +Some pictures are based on or inspired by: + +- [Roundicons](https://www.flaticon.com/authors/roundicons) +- [Smashicons](https://www.flaticon.com/authors/smashicons) +- [EmojiOne](https://github.com/EmojiTwo/emojitwo) : Portal DMS icon +- [GitHub Octicons](https://github.com/primer/octicons/) : The main DMS icon diff --git a/dms/readme/DESCRIPTION.md b/dms/readme/DESCRIPTION.md new file mode 100644 index 000000000..30699df55 --- /dev/null +++ b/dms/readme/DESCRIPTION.md @@ -0,0 +1,9 @@ +DMS is a module for creating, managing and viewing document files +directly within Odoo. This module is only the basis for an entire +ecosystem of apps that extend and seamlessly integrate with the document +management system. + +This module adds portal functionality for directories and files for +allowed users, both portal or internal users. You can get as well a +tokenized link from a directory or a file for sharing it with any +anonymous user. diff --git a/dms/readme/INSTALL.md b/dms/readme/INSTALL.md new file mode 100644 index 000000000..c8eb8aba7 --- /dev/null +++ b/dms/readme/INSTALL.md @@ -0,0 +1,4 @@ +## Preview + +`python-magic` library is recommended to be installed for having whole +support to get proper file types and file preview. diff --git a/dms/readme/ROADMAP.md b/dms/readme/ROADMAP.md new file mode 100644 index 000000000..27f7de77f --- /dev/null +++ b/dms/readme/ROADMAP.md @@ -0,0 +1,21 @@ +- Files preview in portal +- Allow to download folder in portal and create zip file with all + content +- Save in cache own_root directories and update in every + create/write/unlink function +- Add a migration procedure for converting an storage to attachment one + for populating existing records with attachments as folders +- Add a link from attachment view in chatter to linked documents +- If Inherit permissions from related record (the + inherit_access_from_parent_record field from storage) is changed when + directories already exist, inconsistencies may occur because groups + defined in the directories and subdirectories will still exist, all + groups in these directories should be removed before changing. +- Since portal users can read `dms.storage` records, if your module + extends this model to another storage backend that needs using + secrets, remember to forbid access to the secrets fields by other + means. It would be nice to be able to remove that rule at some point. +- Searchpanel in files: Highlight items (shading) without records when + filtering something (by name for example). +- Accessing the clipboard (for example copy share link of file/directory) + is limited to secure connections. It also happens in any part of Odoo. diff --git a/dms/readme/USAGE.md b/dms/readme/USAGE.md new file mode 100644 index 000000000..115fee86e --- /dev/null +++ b/dms/readme/USAGE.md @@ -0,0 +1,11 @@ +The best way to manage the documents is to switch to the Documents view. +Existing documents can be managed there and new documents can be +created. + +## Portal functionality + +You can add any portal user to DMS access groups, and then allow that +group in directories, so they will see in the portal such directories +and their files. Another possibility is to click on "Share" button +inside a directory or a file for obtaining a tokenized link for single +access to that resource, no matter if logged or not. diff --git a/dms/security/ir.model.access.csv b/dms/security/ir.model.access.csv new file mode 100644 index 000000000..df6f68447 --- /dev/null +++ b/dms/security/ir.model.access.csv @@ -0,0 +1,21 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_dms_tag_viewer,dms_tag_viewer,model_dms_tag,group_dms_viewer,1,0,0,0 +access_dms_tag_editor,dms_tag_editor,model_dms_tag,group_dms_user,1,1,1,0 +access_dms_tag_manager,dms_tag_manager,model_dms_tag,group_dms_manager,1,1,1,1 +access_dms_category_viewer,dms_category_viewer,model_dms_category,group_dms_viewer,1,0,0,0 +access_dms_category_editor,dms_category_editor,model_dms_category,group_dms_user,1,1,1,0 +access_dms_category_manager,dms_category_manager,model_dms_category,group_dms_manager,1,1,1,1 +access_dms_storage_viewer,dms_storage_viewer,model_dms_storage,group_dms_viewer,1,0,0,0 +access_dms_storage_editor,dms_storage_editor,model_dms_storage,group_dms_user,1,0,0,0 +access_dms_storage_manager,dms_storage_manager,model_dms_storage,group_dms_manager,1,1,1,1 +access_dms_directory_viewer,dms_directory_viewer,model_dms_directory,group_dms_viewer,1,0,0,0 +access_dms_directory_editor,dms_directory_editor,model_dms_directory,group_dms_user,1,1,0,0 +access_dms_directory_manager,dms_directory_manager,model_dms_directory,group_dms_manager,1,1,1,1 +access_dms_file_viewer,dms_file_viewer,model_dms_file,group_dms_viewer,1,0,0,0 +access_dms_file_editor,dms_file_editor,model_dms_file,group_dms_user,1,1,0,0 +access_dms_file_manager,dms_file_manager,model_dms_file,group_dms_manager,1,1,1,1 +access_dms_access_group_viewer,dms_access_group_viewer,model_dms_access_group,group_dms_viewer,1,0,0,0 +access_dms_access_group_editor,dms_access_group_editor,model_dms_access_group,group_dms_user,1,0,0,0 +access_dms_access_group_manager,dms_access_group_manager,model_dms_access_group,group_dms_manager,1,1,1,1 +access_wizard_dms_file_move_editor,wizard_dms_file_move_editor,model_wizard_dms_file_move,group_dms_user,1,1,1,1 +access_wizard_dms_share_manager,wizard_dms_share_manager,model_wizard_dms_share,group_dms_manager,1,1,1,1 diff --git a/dms/security/security.xml b/dms/security/security.xml new file mode 100644 index 000000000..15cba270b --- /dev/null +++ b/dms/security/security.xml @@ -0,0 +1,255 @@ + + + + + Documents + + + Viewer + + + + + Editor + + + + + Administrator + + + + + DMS Storage multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + DMS Directory multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + File multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + Locked files are only modified by locker user. + + + + + + + + ['|', ('locked_by', '=', False), ('locked_by', '=', user.id)] + + + DMS users can only edit and delete their own groups. + + + + + + + [('create_uid','=',user.id)] + + + DMS Managers can edit and delete all groups. + + + + + + + [(1 ,'=', 1)] + + + + Basic users cannot access hidden storage + + + + + + + [('is_hidden', '=', False)] + + + Managers can access hidden storage + + + + + + + [('is_hidden', '=', True)] + + + + Apply computed create permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can create any directory. + + + + + + + [(1, '=', 1)] + + + Apply computed read permissions. + + + + + + + [(1, '=', 1)] + + + Apply computed unlink permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can unlink any directory. + + + + + + + [(1, '=', 1)] + + + Apply computed write permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can write any directory. + + + + + + + [(1, '=', 1)] + + + Apply computed create permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can create any file. + + + + + + + [(1, '=', 1)] + + + Apply computed read permissions. + + + + + + + [(1, '=', 1)] + + + Apply computed unlink permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can unlink any file. + + + + + + + [(1, '=', 1)] + + + Apply computed write permissions. + + + + + + + [(1, '=', 1)] + + + DMS Managers can write any file. + + + + + + + [(1, '=', 1)] + + diff --git a/dms/static/description/icon.png b/dms/static/description/icon.png new file mode 100644 index 000000000..26d62db69 Binary files /dev/null and b/dms/static/description/icon.png differ diff --git a/dms/static/description/icon.svg b/dms/static/description/icon.svg new file mode 100644 index 000000000..663c409de --- /dev/null +++ b/dms/static/description/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/dms/static/description/index.html b/dms/static/description/index.html new file mode 100644 index 000000000..854441b41 --- /dev/null +++ b/dms/static/description/index.html @@ -0,0 +1,620 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Document Management System

+ +

Beta License: LGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

+

DMS is a module for creating, managing and viewing document files +directly within Odoo. This module is only the basis for an entire +ecosystem of apps that extend and seamlessly integrate with the document +management system.

+

This module adds portal functionality for directories and files for +allowed users, both portal or internal users. You can get as well a +tokenized link from a directory or a file for sharing it with any +anonymous user.

+

Table of contents

+ +
+

Installation

+
+

Preview

+

python-magic library is recommended to be installed for having whole +support to get proper file types and file preview.

+
+
+ +
+

Configuration

+

To configure this module, you need to:

+
+

1. Create a storage

+
    +
  1. Go to Documents -> Configuration -> Storages.
  2. +
  3. Create a new document storage. You can choose between three options +on Save Type:
      +
    • Database: Store the files on the database as a field
    • +
    • Attachment: Store the files as attachments
    • +
    • File: Store the files on the file system
    • +
    +
  4. +
+
+
+

2. Create an access group

+
    +
  1. Next, create an administrative access group. Go to Configuration -> +Access Groups.
      +
    • Create a new group, name it appropriately, and turn on all three +permissions (Create, Write and Unlink. Read is implied and always +enabled).
    • +
    • Add any other top-level administrative users to the group if needed +(your user should already be there).
    • +
    • You can create other groups in here later for fine-grained access +control.
    • +
    +
  2. +
+
+
+

3. Create a directory

+
    +
  1. Afterward, go to Documents -> Directories.
  2. +
  3. Create a new directory, mark it as root and select the previously +created setting.
      +
    • Select the Groups tab and add your administrative group created +above. If your directory was already created before the group, you +can also add it in the access groups (Configuration -> Access +Groups).
    • +
    +
  4. +
  5. In the directory settings, you can also add other access groups +(created above) that will be able to:
      +
    • read
    • +
    • create
    • +
    • write
    • +
    • delete
    • +
    +
  6. +
+
+
+
+

Migration

+

If you need to modify the storage Save Type you might want to +migrate the file data. To achieve it, you need to:

+
    +
  1. Go to Documents -> Configuration -> Storage and select the storage +you want to modify
  2. +
  3. Modify the save type
  4. +
  5. Press the button Migrate files if you want to migrate all the files +at once
  6. +
  7. Press the button Manual File Migration to specify files one by one
  8. +
+

You can check all the files that still need to be migrated from all +storages and migrate them manually on Documents -> Configuration -> +Migration

+
+
+

File Wizard Selection

+

There is an action called action_dms_file_wizard_selector to open a +wizard to list files in kanban view. This can be used (example +dms_attachment_link module) to add a button in kanban view with the +action we need.

+
+
+

Usage

+

The best way to manage the documents is to switch to the Documents view. +Existing documents can be managed there and new documents can be +created.

+
+

Portal functionality

+

You can add any portal user to DMS access groups, and then allow that +group in directories, so they will see in the portal such directories +and their files. Another possibility is to click on “Share” button +inside a directory or a file for obtaining a tokenized link for single +access to that resource, no matter if logged or not.

+
+
+
+

Known issues / Roadmap

+
    +
  • Files preview in portal
  • +
  • Allow to download folder in portal and create zip file with all +content
  • +
  • Save in cache own_root directories and update in every +create/write/unlink function
  • +
  • Add a migration procedure for converting an storage to attachment one +for populating existing records with attachments as folders
  • +
  • Add a link from attachment view in chatter to linked documents
  • +
  • If Inherit permissions from related record (the +inherit_access_from_parent_record field from storage) is changed when +directories already exist, inconsistencies may occur because groups +defined in the directories and subdirectories will still exist, all +groups in these directories should be removed before changing.
  • +
  • Since portal users can read dms.storage records, if your module +extends this model to another storage backend that needs using +secrets, remember to forbid access to the secrets fields by other +means. It would be nice to be able to remove that rule at some point.
  • +
  • Searchpanel in files: Highlight items (shading) without records when +filtering something (by name for example).
  • +
  • Accessing the clipboard (for example copy share link of +file/directory) is limited to secure connections. It also happens in +any part of Odoo.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • MuK IT
  • +
  • Tecnativa
  • +
+
+
+

Contributors

+ +
+
+

Other credits

+

Some pictures are based on or inspired by:

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/dms project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/dms/static/description/portal_icon.svg b/dms/static/description/portal_icon.svg new file mode 100644 index 000000000..6808515b0 --- /dev/null +++ b/dms/static/description/portal_icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/dms/static/icons/file_ai.svg b/dms/static/icons/file_ai.svg new file mode 100644 index 000000000..6001633d2 --- /dev/null +++ b/dms/static/icons/file_ai.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_aj.svg b/dms/static/icons/file_aj.svg new file mode 100644 index 000000000..15960f591 --- /dev/null +++ b/dms/static/icons/file_aj.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_avi.svg b/dms/static/icons/file_avi.svg new file mode 100644 index 000000000..117a2e45c --- /dev/null +++ b/dms/static/icons/file_avi.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_c.svg b/dms/static/icons/file_c.svg new file mode 100644 index 000000000..9ace81b58 --- /dev/null +++ b/dms/static/icons/file_c.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_cbl.svg b/dms/static/icons/file_cbl.svg new file mode 100644 index 000000000..f6344b98f --- /dev/null +++ b/dms/static/icons/file_cbl.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_cc.svg b/dms/static/icons/file_cc.svg new file mode 100644 index 000000000..8e5f1d8c9 --- /dev/null +++ b/dms/static/icons/file_cc.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_coffee.svg b/dms/static/icons/file_coffee.svg new file mode 100644 index 000000000..ea45eb8bd --- /dev/null +++ b/dms/static/icons/file_coffee.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_cs.svg b/dms/static/icons/file_cs.svg new file mode 100644 index 000000000..2faa65411 --- /dev/null +++ b/dms/static/icons/file_cs.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_css.svg b/dms/static/icons/file_css.svg new file mode 100644 index 000000000..5ebb3825e --- /dev/null +++ b/dms/static/icons/file_css.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_csv.svg b/dms/static/icons/file_csv.svg new file mode 100644 index 000000000..bb37b9b11 --- /dev/null +++ b/dms/static/icons/file_csv.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_dbf.svg b/dms/static/icons/file_dbf.svg new file mode 100644 index 000000000..9553c913e --- /dev/null +++ b/dms/static/icons/file_dbf.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_dll.svg b/dms/static/icons/file_dll.svg new file mode 100644 index 000000000..e0c99af01 --- /dev/null +++ b/dms/static/icons/file_dll.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_doc.svg b/dms/static/icons/file_doc.svg new file mode 100644 index 000000000..833d1c721 --- /dev/null +++ b/dms/static/icons/file_doc.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_docx.svg b/dms/static/icons/file_docx.svg new file mode 100644 index 000000000..b1160efcd --- /dev/null +++ b/dms/static/icons/file_docx.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_dwg.svg b/dms/static/icons/file_dwg.svg new file mode 100644 index 000000000..f3008372f --- /dev/null +++ b/dms/static/icons/file_dwg.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_eml.svg b/dms/static/icons/file_eml.svg new file mode 100644 index 000000000..065ff7e13 --- /dev/null +++ b/dms/static/icons/file_eml.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_eps.svg b/dms/static/icons/file_eps.svg new file mode 100644 index 000000000..b767a36d3 --- /dev/null +++ b/dms/static/icons/file_eps.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_exe.svg b/dms/static/icons/file_exe.svg new file mode 100644 index 000000000..e79009c32 --- /dev/null +++ b/dms/static/icons/file_exe.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_f.svg b/dms/static/icons/file_f.svg new file mode 100644 index 000000000..e742e363e --- /dev/null +++ b/dms/static/icons/file_f.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_fla.svg b/dms/static/icons/file_fla.svg new file mode 100644 index 000000000..02bb98fb4 --- /dev/null +++ b/dms/static/icons/file_fla.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_gif.svg b/dms/static/icons/file_gif.svg new file mode 100644 index 000000000..71c64f5cc --- /dev/null +++ b/dms/static/icons/file_gif.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_go.svg b/dms/static/icons/file_go.svg new file mode 100644 index 000000000..efa4ad898 --- /dev/null +++ b/dms/static/icons/file_go.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_groovy.svg b/dms/static/icons/file_groovy.svg new file mode 100644 index 000000000..10ee7c136 --- /dev/null +++ b/dms/static/icons/file_groovy.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_html.svg b/dms/static/icons/file_html.svg new file mode 100644 index 000000000..7b57d5325 --- /dev/null +++ b/dms/static/icons/file_html.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_iso.svg b/dms/static/icons/file_iso.svg new file mode 100644 index 000000000..9a3abba40 --- /dev/null +++ b/dms/static/icons/file_iso.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_java.svg b/dms/static/icons/file_java.svg new file mode 100644 index 000000000..ce4d9d644 --- /dev/null +++ b/dms/static/icons/file_java.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_jpg.svg b/dms/static/icons/file_jpg.svg new file mode 100644 index 000000000..96732375c --- /dev/null +++ b/dms/static/icons/file_jpg.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_js.svg b/dms/static/icons/file_js.svg new file mode 100644 index 000000000..c510c1858 --- /dev/null +++ b/dms/static/icons/file_js.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_json.svg b/dms/static/icons/file_json.svg new file mode 100644 index 000000000..7e97918f0 --- /dev/null +++ b/dms/static/icons/file_json.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_less.svg b/dms/static/icons/file_less.svg new file mode 100644 index 000000000..1f44ccc55 --- /dev/null +++ b/dms/static/icons/file_less.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_md.svg b/dms/static/icons/file_md.svg new file mode 100644 index 000000000..145c81bbd --- /dev/null +++ b/dms/static/icons/file_md.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_mov.svg b/dms/static/icons/file_mov.svg new file mode 100644 index 000000000..3cc578172 --- /dev/null +++ b/dms/static/icons/file_mov.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_mp3.svg b/dms/static/icons/file_mp3.svg new file mode 100644 index 000000000..a28f5e575 --- /dev/null +++ b/dms/static/icons/file_mp3.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_mp4.svg b/dms/static/icons/file_mp4.svg new file mode 100644 index 000000000..67f6fab69 --- /dev/null +++ b/dms/static/icons/file_mp4.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_odp.svg b/dms/static/icons/file_odp.svg new file mode 100644 index 000000000..0238d643d --- /dev/null +++ b/dms/static/icons/file_odp.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_ods.svg b/dms/static/icons/file_ods.svg new file mode 100644 index 000000000..ac3c19c7d --- /dev/null +++ b/dms/static/icons/file_ods.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_odt.svg b/dms/static/icons/file_odt.svg new file mode 100644 index 000000000..0340ca2f2 --- /dev/null +++ b/dms/static/icons/file_odt.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_pdf.svg b/dms/static/icons/file_pdf.svg new file mode 100644 index 000000000..f4063eb21 --- /dev/null +++ b/dms/static/icons/file_pdf.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_php.svg b/dms/static/icons/file_php.svg new file mode 100644 index 000000000..0402747b2 --- /dev/null +++ b/dms/static/icons/file_php.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_ppt.svg b/dms/static/icons/file_ppt.svg new file mode 100644 index 000000000..b3a1ea7c7 --- /dev/null +++ b/dms/static/icons/file_ppt.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_pptx.svg b/dms/static/icons/file_pptx.svg new file mode 100644 index 000000000..0d5c5b85c --- /dev/null +++ b/dms/static/icons/file_pptx.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_psd.svg b/dms/static/icons/file_psd.svg new file mode 100644 index 000000000..818ef7ecb --- /dev/null +++ b/dms/static/icons/file_psd.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_py.svg b/dms/static/icons/file_py.svg new file mode 100644 index 000000000..068dcbca5 --- /dev/null +++ b/dms/static/icons/file_py.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_rar.svg b/dms/static/icons/file_rar.svg new file mode 100644 index 000000000..7cd14c57a --- /dev/null +++ b/dms/static/icons/file_rar.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_raw.svg b/dms/static/icons/file_raw.svg new file mode 100644 index 000000000..20347f4bd --- /dev/null +++ b/dms/static/icons/file_raw.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_rtf.svg b/dms/static/icons/file_rtf.svg new file mode 100644 index 000000000..a7de37b26 --- /dev/null +++ b/dms/static/icons/file_rtf.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_sass.svg b/dms/static/icons/file_sass.svg new file mode 100644 index 000000000..d84424676 --- /dev/null +++ b/dms/static/icons/file_sass.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_sc.svg b/dms/static/icons/file_sc.svg new file mode 100644 index 000000000..c067be487 --- /dev/null +++ b/dms/static/icons/file_sc.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_sh.svg b/dms/static/icons/file_sh.svg new file mode 100644 index 000000000..e0c4f3e24 --- /dev/null +++ b/dms/static/icons/file_sh.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_svg.svg b/dms/static/icons/file_svg.svg new file mode 100644 index 000000000..dfad09a0a --- /dev/null +++ b/dms/static/icons/file_svg.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_tar.svg b/dms/static/icons/file_tar.svg new file mode 100644 index 000000000..5bbacc09f --- /dev/null +++ b/dms/static/icons/file_tar.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_ttf.svg b/dms/static/icons/file_ttf.svg new file mode 100644 index 000000000..06809a5c2 --- /dev/null +++ b/dms/static/icons/file_ttf.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_txt.svg b/dms/static/icons/file_txt.svg new file mode 100644 index 000000000..a4160ec92 --- /dev/null +++ b/dms/static/icons/file_txt.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_unknown.svg b/dms/static/icons/file_unknown.svg new file mode 100644 index 000000000..a48144a6d --- /dev/null +++ b/dms/static/icons/file_unknown.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_wav.svg b/dms/static/icons/file_wav.svg new file mode 100644 index 000000000..e36f05b6a --- /dev/null +++ b/dms/static/icons/file_wav.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_xls.svg b/dms/static/icons/file_xls.svg new file mode 100644 index 000000000..ad9f2dd05 --- /dev/null +++ b/dms/static/icons/file_xls.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_xlsx.svg b/dms/static/icons/file_xlsx.svg new file mode 100644 index 000000000..abfb50bf7 --- /dev/null +++ b/dms/static/icons/file_xlsx.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_xml.svg b/dms/static/icons/file_xml.svg new file mode 100644 index 000000000..19e77d2f7 --- /dev/null +++ b/dms/static/icons/file_xml.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/file_zip.svg b/dms/static/icons/file_zip.svg new file mode 100644 index 000000000..73ed3273c --- /dev/null +++ b/dms/static/icons/file_zip.svg @@ -0,0 +1 @@ + diff --git a/dms/static/icons/folder.svg b/dms/static/icons/folder.svg new file mode 100644 index 000000000..90547b0ad --- /dev/null +++ b/dms/static/icons/folder.svg @@ -0,0 +1 @@ + diff --git a/dms/static/lib/img/banner/documents_onboarding_directory.png b/dms/static/lib/img/banner/documents_onboarding_directory.png new file mode 100644 index 000000000..d79387705 Binary files /dev/null and b/dms/static/lib/img/banner/documents_onboarding_directory.png differ diff --git a/dms/static/lib/img/banner/documents_onboarding_file.png b/dms/static/lib/img/banner/documents_onboarding_file.png new file mode 100644 index 000000000..ac830fa6b Binary files /dev/null and b/dms/static/lib/img/banner/documents_onboarding_file.png differ diff --git a/dms/static/src/js/fields/path_json/path_owl.esm.js b/dms/static/src/js/fields/path_json/path_owl.esm.js new file mode 100644 index 000000000..05c2d48b6 --- /dev/null +++ b/dms/static/src/js/fields/path_json/path_owl.esm.js @@ -0,0 +1,52 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {Component, onWillUpdateProps} from "@odoo/owl"; +import {_t} from "@web/core/l10n/translation"; +import {registry} from "@web/core/registry"; +import {standardFieldProps} from "@web/views/fields/standard_field_props"; +import {useService} from "@web/core/utils/hooks"; + +class DmsPathField extends Component { + setup() { + super.setup(); + this.action = useService("action"); + this.formatData(this.props); + onWillUpdateProps((nextProps) => this.formatData(nextProps)); + } + + formatData(props) { + const path_json = props.record.data && props.record.data.path_json; + this.data = JSON.parse(path_json || "[]"); + } + + _onNodeClicked(event) { + event.preventDefault(); + const target = event.currentTarget; + this.action.doAction({ + type: "ir.actions.act_window", + res_model: target.getAttribute("data-model"), + res_id: Number(target.getAttribute("data-id")), + views: [[false, "form"]], + target: "current", + context: {}, + }); + } +} + +DmsPathField.template = "dms.DmsPathField"; +DmsPathField.props = { + ...standardFieldProps, +}; + +const dmsPathField = { + component: DmsPathField, + displayName: _t("Dms Path Field"), + supportedTypes: ["text"], + extractProps: () => { + return {}; + }, +}; + +registry.category("fields").add("path_json", dmsPathField); diff --git a/dms/static/src/js/fields/path_json/path_owl.xml b/dms/static/src/js/fields/path_json/path_owl.xml new file mode 100644 index 000000000..b2a8e7c70 --- /dev/null +++ b/dms/static/src/js/fields/path_json/path_owl.xml @@ -0,0 +1,30 @@ + + + + + + + + / + + + + + + / + + + + + + + diff --git a/dms/static/src/js/fields/preview_binary/preview_record.esm.js b/dms/static/src/js/fields/preview_binary/preview_record.esm.js new file mode 100644 index 000000000..ca55cdd5b --- /dev/null +++ b/dms/static/src/js/fields/preview_binary/preview_record.esm.js @@ -0,0 +1,45 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {BinaryField} from "@web/views/fields/binary/binary_field"; +import {_t} from "@web/core/l10n/translation"; +import {registry} from "@web/core/registry"; +import {standardFieldProps} from "@web/views/fields/standard_field_props"; +import {useFileViewer} from "@web/core/file_viewer/file_viewer_hook"; +import {useService} from "@web/core/utils/hooks"; + +export class PreviewRecordField extends BinaryField { + setup() { + super.setup(); + this.store = useService("mail.store"); + this.fileViewer = useFileViewer(); + } + + onFilePreview() { + const self = this; + const attachment = this.store.Attachment.insert({ + id: self.props.record.resId, + filename: self.props.record.data.display_name || "", + name: self.props.record.data.display_name || "", + mimetype: self.props.record.data.mimetype, + model_name: self.props.record.resModel, + }); + this.fileViewer.open(attachment); + } +} + +PreviewRecordField.template = "dms.FilePreviewField"; +PreviewRecordField.props = { + ...standardFieldProps, +}; + +const previewRecordField = { + component: PreviewRecordField, + displayName: _t("Preview Record"), + supportedTypes: ["binary"], + extractProps: () => { + return {}; + }, +}; +registry.category("fields").add("preview_binary", previewRecordField); diff --git a/dms/static/src/js/fields/preview_binary/preview_record.xml b/dms/static/src/js/fields/preview_binary/preview_record.xml new file mode 100644 index 000000000..796e74707 --- /dev/null +++ b/dms/static/src/js/fields/preview_binary/preview_record.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + diff --git a/dms/static/src/js/views/file_kanban_record.esm.js b/dms/static/src/js/views/file_kanban_record.esm.js new file mode 100644 index 000000000..335fb08dd --- /dev/null +++ b/dms/static/src/js/views/file_kanban_record.esm.js @@ -0,0 +1,59 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {KanbanRecord} from "@web/views/kanban/kanban_record"; +import {useFileViewer} from "@web/core/file_viewer/file_viewer_hook"; +import {useService} from "@web/core/utils/hooks"; + +const videoReadableTypes = ["x-matroska", "mp4", "webm"]; +const audioReadableTypes = ["mp3", "ogg", "wav", "aac", "mpa", "flac", "m4a"]; + +export class FileKanbanRecord extends KanbanRecord { + setup() { + super.setup(); + this.store = useService("mail.store"); + this.fileViewer = useFileViewer(); + } + + isVideo(mimetype) { + return videoReadableTypes.includes(mimetype); + } + + isAudio(mimetype) { + return audioReadableTypes.includes(mimetype); + } + + /** + * @override + * + * Override to open the preview upon clicking the image, if compatible. + */ + onGlobalClick(ev) { + const self = this; + + if (ev.target.closest(".o_kanban_dms_file_preview")) { + const file_type = self.props.record.data.name.split(".")[1]; + let mimetype = ""; + + if (self.isVideo(file_type)) { + mimetype = `video/${file_type}`; + } else if (self.isAudio(file_type)) { + mimetype = "audio/mpeg"; + } else { + mimetype = self.props.record.data.mimetype; + } + + const attachment = this.store.Attachment.insert({ + id: self.props.record.data.id, + filename: self.props.record.data.name, + name: self.props.record.data.name, + mimetype: mimetype, + model_name: self.props.record.resModel, + }); + this.fileViewer.open(attachment); + return; + } + return super.onGlobalClick(ev); + } +} diff --git a/dms/static/src/js/views/file_kanban_renderer.esm.js b/dms/static/src/js/views/file_kanban_renderer.esm.js new file mode 100644 index 000000000..157f74fe3 --- /dev/null +++ b/dms/static/src/js/views/file_kanban_renderer.esm.js @@ -0,0 +1,17 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {FileKanbanRecord} from "./file_kanban_record.esm"; +import {KanbanRenderer} from "@web/views/kanban/kanban_renderer"; + +export class FileKanbanRenderer extends KanbanRenderer { + setup() { + super.setup(); + } +} + +FileKanbanRenderer.components = { + ...KanbanRenderer.components, + KanbanRecord: FileKanbanRecord, +}; diff --git a/dms/static/src/js/views/file_kanban_renderer.xml b/dms/static/src/js/views/file_kanban_renderer.xml new file mode 100644 index 000000000..877a93b79 --- /dev/null +++ b/dms/static/src/js/views/file_kanban_renderer.xml @@ -0,0 +1,20 @@ + + + + + +
+ +
+
+
+ + +
diff --git a/dms/static/src/js/views/file_kanban_view.esm.js b/dms/static/src/js/views/file_kanban_view.esm.js new file mode 100644 index 000000000..deb359609 --- /dev/null +++ b/dms/static/src/js/views/file_kanban_view.esm.js @@ -0,0 +1,27 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import { + createFileDropZoneExtension, + createFileUploadExtension, +} from "./dms_file_upload.esm"; +import {FileKanbanRenderer} from "./file_kanban_renderer.esm"; +import {KanbanController} from "@web/views/kanban/kanban_controller"; +import {kanbanView} from "@web/views/kanban/kanban_view"; +import {patch} from "@web/core/utils/patch"; +import {registry} from "@web/core/registry"; + +patch(FileKanbanRenderer.prototype, createFileDropZoneExtension()); +patch(KanbanController.prototype, createFileUploadExtension()); +FileKanbanRenderer.template = "dms.KanbanRenderer"; + +export const FileKanbanView = { + ...kanbanView, + Renderer: FileKanbanRenderer, +}; + +registry.category("views").add("file_kanban", FileKanbanView); diff --git a/dms/static/src/js/views/file_list_controller.esm.js b/dms/static/src/js/views/file_list_controller.esm.js new file mode 100644 index 000000000..632dd37c6 --- /dev/null +++ b/dms/static/src/js/views/file_list_controller.esm.js @@ -0,0 +1,13 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import {ListController} from "@web/views/list/list_controller"; + +export class FileListController extends ListController { + setup() { + super.setup(...arguments); + } +} diff --git a/dms/static/src/js/views/file_list_renderer.esm.js b/dms/static/src/js/views/file_list_renderer.esm.js new file mode 100644 index 000000000..08edd549b --- /dev/null +++ b/dms/static/src/js/views/file_list_renderer.esm.js @@ -0,0 +1,16 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import {ListRenderer} from "@web/views/list/list_renderer"; + +export class FileListRenderer extends ListRenderer { + setup() { + super.setup(); + } +} + +FileListRenderer.components = { + ...FileListRenderer.components, +}; diff --git a/dms/static/src/js/views/file_list_renderer.xml b/dms/static/src/js/views/file_list_renderer.xml new file mode 100644 index 000000000..11c6da8c5 --- /dev/null +++ b/dms/static/src/js/views/file_list_renderer.xml @@ -0,0 +1,45 @@ + + + + +
+ +
+
+
+ + + + + + + + + + + +
diff --git a/dms/static/src/js/views/file_list_view.esm.js b/dms/static/src/js/views/file_list_view.esm.js new file mode 100644 index 000000000..e41dadff5 --- /dev/null +++ b/dms/static/src/js/views/file_list_view.esm.js @@ -0,0 +1,28 @@ +// /** ******************************************************************************** +// Copyright 2020 Creu Blanca +// Copyright 2017-2019 MuK IT GmbH +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ + +import { + createFileDropZoneExtension, + createFileUploadExtension, +} from "./dms_file_upload.esm"; +import {FileListRenderer} from "./file_list_renderer.esm"; +import {ListController} from "@web/views/list/list_controller"; +import {listView} from "@web/views/list/list_view"; +import {patch} from "@web/core/utils/patch"; +import {registry} from "@web/core/registry"; + +patch(FileListRenderer.prototype, createFileDropZoneExtension()); +patch(ListController.prototype, createFileUploadExtension()); +FileListRenderer.template = "dms.ListRenderer"; + +export const FileListView = { + ...listView, + buttonTemplate: "dms.ListButtons", + Renderer: FileListRenderer, +}; + +registry.category("views").add("file_list", FileListView); diff --git a/dms/static/src/js/views/search_panel.esm.js b/dms/static/src/js/views/search_panel.esm.js new file mode 100644 index 000000000..d71c743bf --- /dev/null +++ b/dms/static/src/js/views/search_panel.esm.js @@ -0,0 +1,27 @@ +/* Copyright 2021-2024 Tecnativa - Víctor Martínez + * Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ + +import {SearchModel} from "@web/search/search_model"; + +export class DMSSearchPanel extends SearchModel { + _getCategoryDomain(excludedCategoryId) { + const domain = super._getCategoryDomain(...arguments); + for (const category of this.categories) { + if (category.id === Number(excludedCategoryId)) { + continue; + } + + // Make sure to filter selected category only for DMS hierarchies, + // not other Odoo models such as product categories + // where child_of could be better than "=" operator + if (category.activeValueId && this.resModel.startsWith("dms")) { + domain.push([category.fieldName, "=", category.activeValueId]); + } + if (domain.length === 0 && this.resModel === "dms.directory") { + domain.push([category.fieldName, "=", false]); + } + } + return domain; + } +} diff --git a/dms/static/src/models/attachment.esm.js b/dms/static/src/models/attachment.esm.js new file mode 100644 index 000000000..6ff6d5bfd --- /dev/null +++ b/dms/static/src/models/attachment.esm.js @@ -0,0 +1,87 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {Attachment} from "@mail/core/common/attachment_model"; +import {patch} from "@web/core/utils/patch"; + +patch(Attachment.prototype, { + _handleImage() { + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.id}?signature=${this.checksum}`; + }, + _handlePdf() { + if (this.model_name && this.model_name === "dms.file") { + return ( + "/web/content?id=" + + this.id + + "&field=content&model=dms.file" + + "&filename_field=name" + ); + } + const pdf_lib = `/web/static/lib/pdfjs/web/viewer.html?file=`; + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `${pdf_lib}/mail/channel/${this.originThread.id}/attachment/${this.id}#pagemode=none`; + } + const accessToken = this.accessToken + ? `?access_token%3D${this.accessToken}` + : ""; + return `${pdf_lib}/web/content/${this.id}${accessToken}#pagemode=none`; + }, + _handleYoutube() { + const urlArr = this.url.split("/"); + let token = urlArr[urlArr.length - 1]; + if (token.includes("watch")) { + token = token.split("v=")[1]; + const amp = token.indexOf("&"); + if (amp !== -1) { + token = token.substring(0, amp); + } + } + return `https://www.youtube.com/embed/${token}`; + }, + get defaultSource() { + if (this.isImage) { + return this._handleImage(); + } + if (this.isPdf) { + return this._handlePdf(); + } + if (this.isUrlYoutube) { + return this._handleYoutube(); + } + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.originThread.id}/attachment/${this.id}`; + } + const accessToken = this.accessToken ? `?access_token=${this.accessToken}` : ""; + + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name`; + } + return `/web/content/${this.id}${accessToken}`; + }, + get downloadUrl() { + if ( + !this.accessToken && + this.originThread && + this.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.originThread.id}/attachment/${this.id}?download=true`; + } + if (this.model_name && this.model_name === "dms.file") { + return `/web/content?id=${this.id}&field=content&model=dms.file&filename_field=name&download=true`; + } + const accessToken = this.accessToken ? `access_token=${this.accessToken}&` : ""; + return `/web/content/ir.attachment/${this.id}/datas?${accessToken}download=true`; + }, +}); diff --git a/dms/static/src/models/attachment_image.esm.js b/dms/static/src/models/attachment_image.esm.js new file mode 100644 index 000000000..308ea8ea5 --- /dev/null +++ b/dms/static/src/models/attachment_image.esm.js @@ -0,0 +1,33 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {LinkPreview} from "@mail/core/common/link_preview"; +import {patch} from "@web/core/utils/patch"; + +patch(LinkPreview, { + get imageUrl() { + return function compute() { + if (!this.attachment) { + return; + } + if ( + !this.attachment.accessToken && + this.attachment.originThread && + this.attachment.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.attachment.originThread.id}/image/${this.attachment.id}/${this.width}x${this.height}`; + } + const accessToken = this.attachment.accessToken + ? `?access_token=${this.attachment.accessToken}` + : ""; + if ( + this.attachment.model_name && + this.attachment.model_name === "dms.file" + ) { + return `/web/content?id=${this.attachment.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.attachment.id}/${this.width}x${this.height}${accessToken}`; + }; + }, +}); diff --git a/dms/static/src/models/attachment_viewer_viewable.esm.js b/dms/static/src/models/attachment_viewer_viewable.esm.js new file mode 100644 index 000000000..7c338ed9d --- /dev/null +++ b/dms/static/src/models/attachment_viewer_viewable.esm.js @@ -0,0 +1,30 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {LinkPreview} from "@mail/core/common/link_preview"; +import {patch} from "@web/core/utils/patch"; + +patch(LinkPreview, { + get imageUrl() { + return function compute() { + if ( + !this.attachmentOwner.accessToken && + this.attachmentOwner.originThread && + this.attachmentOwner.originThread.model === "mail.channel" + ) { + return `/mail/channel/${this.attachmentOwner.originThread.id}/image/${this.attachmentOwner.id}`; + } + const accessToken = this.attachmentOwner.accessToken + ? `?access_token=${this.attachmentOwner.accessToken}` + : ""; + if ( + this.attachmentOwner.model_name && + this.attachmentOwner.model_name === "dms.file" + ) { + return `/web/content?id=${this.attachmentOwner.id}&field=content&model=dms.file&filename_field=name&download=false`; + } + return `/web/image/${this.attachmentOwner.id}${accessToken}`; + }; + }, +}); diff --git a/dms/static/src/scss/portal.scss b/dms/static/src/scss/portal.scss new file mode 100644 index 000000000..870da4be3 --- /dev/null +++ b/dms/static/src/scss/portal.scss @@ -0,0 +1,12 @@ +/********************************************************************************** +* +* Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ + +.o_portal_contact_img { + width: 2.3em; + height: 2.3em; + object-fit: cover; +} diff --git a/dms/static/tests/tours/dms_portal_tour.esm.js b/dms/static/tests/tours/dms_portal_tour.esm.js new file mode 100644 index 000000000..3a69629ec --- /dev/null +++ b/dms/static/tests/tours/dms_portal_tour.esm.js @@ -0,0 +1,42 @@ +// /** ******************************************************************************** +// Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// **********************************************************************************/ +import {registry} from "@web/core/registry"; + +registry.category("web_tour.tours").add("dms_portal_mail_tour", { + url: "/my/dms", + test: true, + steps: () => [ + { + content: "Go to Mails directory", + trigger: ".tr_dms_directory_link:contains('Mails')", + run: "click", + }, + { + content: "Go to Mail_01.eml", + trigger: ".tr_dms_file_link:contains('Mail_01.eml')", + }, + ], +}); + +registry.category("web_tour.tours").add("dms_portal_partners_tour", { + url: "/my/dms", + test: true, + steps: () => [ + { + content: "Go to Partners directory", + trigger: ".tr_dms_directory_link:contains('Partners')", + run: "click", + }, + { + content: "Go to Joel Willis", + trigger: ".tr_dms_directory_link:contains('Joel Willis')", + run: "click", + }, + { + content: "Go to test.txt", + trigger: ".tr_dms_file_link:contains('test.txt')", + }, + ], +}); diff --git a/dms/template/portal.xml b/dms/template/portal.xml new file mode 100644 index 000000000..348a7d6d0 --- /dev/null +++ b/dms/template/portal.xml @@ -0,0 +1,139 @@ + + + + + + + diff --git a/dms/test/audio01.wav b/dms/test/audio01.wav new file mode 100644 index 000000000..2a479fc16 Binary files /dev/null and b/dms/test/audio01.wav differ diff --git a/dms/test/audio02.wav b/dms/test/audio02.wav new file mode 100644 index 000000000..179a8d3ab Binary files /dev/null and b/dms/test/audio02.wav differ diff --git a/dms/test/audio03.mp3 b/dms/test/audio03.mp3 new file mode 100644 index 000000000..397abc2e6 Binary files /dev/null and b/dms/test/audio03.mp3 differ diff --git a/dms/test/audio04.mp3 b/dms/test/audio04.mp3 new file mode 100644 index 000000000..4667276e7 Binary files /dev/null and b/dms/test/audio04.mp3 differ diff --git a/dms/test/code01.aj b/dms/test/code01.aj new file mode 100644 index 000000000..bcbd327c5 --- /dev/null +++ b/dms/test/code01.aj @@ -0,0 +1,10 @@ +// HelloWorld.java +public class HelloWorld { + public static void say(String message) { + System.out.println(message); + } + + public static void sayToPerson(String message, String name) { + System.out.println(name + ", " + message); + } +} diff --git a/dms/test/code02.sh b/dms/test/code02.sh new file mode 100644 index 000000000..35d52ff5f --- /dev/null +++ b/dms/test/code02.sh @@ -0,0 +1,9 @@ +#!/bin/bash +## +## +## Copyright 2017-2019 MuK IT GmbH +## License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +## +## +STR="Hello World!" +echo $STR diff --git a/dms/test/code03.c b/dms/test/code03.c new file mode 100644 index 000000000..36c03ec2c --- /dev/null +++ b/dms/test/code03.c @@ -0,0 +1,12 @@ +/* + * + * Copyright 2017-2019 MuK IT GmbH + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + * + */ +#include + +int main(void) +{ + printf("hello, world\n"); +} diff --git a/dms/test/code04.cc b/dms/test/code04.cc new file mode 100644 index 000000000..0b0306294 --- /dev/null +++ b/dms/test/code04.cc @@ -0,0 +1,13 @@ +/* + * + * Copyright 2017-2019 MuK IT GmbH + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + * + */ +#include + +int main() +{ + std::cout << "Hello, world!\n"; + return 0; +} diff --git a/dms/test/code05.cs b/dms/test/code05.cs new file mode 100644 index 000000000..8d94d8dee --- /dev/null +++ b/dms/test/code05.cs @@ -0,0 +1,13 @@ +// +// Copyright 2017-2019 MuK IT GmbH +// License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +// +using System; + +class Program +{ + static void Main(string[] args) + { + Console.WriteLine("Hello, world!"); + } +} diff --git a/dms/test/code06.cbl b/dms/test/code06.cbl new file mode 100644 index 000000000..b89e22a90 --- /dev/null +++ b/dms/test/code06.cbl @@ -0,0 +1,5 @@ +IDENTIFICATION DIVISION. +PROGRAM-ID. hello-world. +PROCEDURE DIVISION. + DISPLAY "Hello, world!" + . diff --git a/dms/test/code07.coffee b/dms/test/code07.coffee new file mode 100644 index 000000000..4b65a573c --- /dev/null +++ b/dms/test/code07.coffee @@ -0,0 +1 @@ +console.log "Hello, World!" diff --git a/dms/test/code08.f b/dms/test/code08.f new file mode 100644 index 000000000..bd3dfb11c --- /dev/null +++ b/dms/test/code08.f @@ -0,0 +1,3 @@ +program helloworld + print *, "Hello world!" +end program helloworld diff --git a/dms/test/code09.go b/dms/test/code09.go new file mode 100644 index 000000000..64e44c3e2 --- /dev/null +++ b/dms/test/code09.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("Hello, World") +} diff --git a/dms/test/code10.groovy b/dms/test/code10.groovy new file mode 100644 index 000000000..f821e94d4 --- /dev/null +++ b/dms/test/code10.groovy @@ -0,0 +1,7 @@ +/********************************************************************************** +* +* Copyright 2017-2019 MuK IT GmbH +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ +println "Hello World" diff --git a/dms/test/code11.java b/dms/test/code11.java new file mode 100644 index 000000000..8678ee37a --- /dev/null +++ b/dms/test/code11.java @@ -0,0 +1,11 @@ +/********************************************************************************** +* +* Copyright 2017-2019 MuK IT GmbH +* License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +* +**********************************************************************************/ +class HelloWorldApp { + public static void main(String[] args) { + System.out.println("Hello World!"); // Prints the string to the console. + } +} diff --git a/dms/test/code12.sc b/dms/test/code12.sc new file mode 100644 index 000000000..133c2b068 --- /dev/null +++ b/dms/test/code12.sc @@ -0,0 +1,3 @@ +object HelloWorld extends App { + println("Hello, World!") + } diff --git a/dms/test/document01.pdf b/dms/test/document01.pdf new file mode 100644 index 000000000..99d31cef1 Binary files /dev/null and b/dms/test/document01.pdf differ diff --git a/dms/test/document02.doc b/dms/test/document02.doc new file mode 100644 index 000000000..9cb3f019e Binary files /dev/null and b/dms/test/document02.doc differ diff --git a/dms/test/document03.odt b/dms/test/document03.odt new file mode 100644 index 000000000..c963be926 Binary files /dev/null and b/dms/test/document03.odt differ diff --git a/dms/test/document04.rtf b/dms/test/document04.rtf new file mode 100644 index 000000000..2379b1956 --- /dev/null +++ b/dms/test/document04.rtf @@ -0,0 +1,23 @@ +{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f73\froman\fcharset238\fprq2 Times New Roman CE;}{\f74\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f76\froman\fcharset161\fprq2 Times New Roman Greek;}{\f77\froman\fcharset162\fprq2 Times New Roman Tur;} +{\f78\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f79\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f80\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f81\fswiss\fcharset238\fprq2 Arial CE;}{\f82\fswiss\fcharset204\fprq2 Arial Cyr;} +{\f84\fswiss\fcharset161\fprq2 Arial Greek;}{\f85\fswiss\fcharset162\fprq2 Arial Tur;}{\f86\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f87\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f88\fswiss\fcharset186\fprq2 Arial Baltic;}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red51\green102\blue255;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \snext0 Normal;}{\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang2057\langfe1033\kerning32\cgrid\langnp2057\langfenp1033 +\sbasedon0 \snext0 heading 1;}{\s3\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs26\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 \sbasedon0 \snext0 heading 3;}{\*\cs10 \additive +Default Paragraph Font;}}{\info{\title The power of technology lies in the ability to match learning styles to the needs of individual learners}{\author Les Mason}{\operator Les Mason}{\creatim\yr2005\mo3\dy15\hr18\min11} +{\revtim\yr2005\mo3\dy15\hr18\min12}{\version1}{\edmins1}{\nofpages1}{\nofwords0}{\nofchars0}{\nofcharsws0}{\vern8203}}\paperw11906\paperh16838 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin +\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1\jexpand\viewkind1\viewscale117\viewzk2\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule \fet0\sectd +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang +{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7 +\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain +\s1\ql \li0\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs32\lang2057\langfe1033\kerning32\cgrid\langnp2057\langfenp1033 { +The power of technology lies in the ability to match learning styles to the needs of individual learners +\par }\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 { +\par }\pard\plain \s3\ql \li720\ri0\sb240\sa60\keepn\widctlpar\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin720\itap0 \b\f1\fs26\lang2057\langfe1033\cgrid\langnp2057\langfenp1033 {\cf17 The more I study the more I l}{\cf17 earn. +\par The more I learn the more I know +\par The more I know the more I forget +\par The more I forget the less I know +\par So why study?}{ +\par }} diff --git a/dms/test/image01.jpg b/dms/test/image01.jpg new file mode 100644 index 000000000..586ceb89d Binary files /dev/null and b/dms/test/image01.jpg differ diff --git a/dms/test/image02.jpg b/dms/test/image02.jpg new file mode 100644 index 000000000..7467c6f61 Binary files /dev/null and b/dms/test/image02.jpg differ diff --git a/dms/test/image03.jpg b/dms/test/image03.jpg new file mode 100644 index 000000000..a35fc1ae8 Binary files /dev/null and b/dms/test/image03.jpg differ diff --git a/dms/test/image04.jpg b/dms/test/image04.jpg new file mode 100644 index 000000000..25a3abe27 Binary files /dev/null and b/dms/test/image04.jpg differ diff --git a/dms/test/mail01.eml b/dms/test/mail01.eml new file mode 100644 index 000000000..1a70357f3 --- /dev/null +++ b/dms/test/mail01.eml @@ -0,0 +1,170 @@ +Return-Path: +To: Manuel Lemos +Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message +From: mlemos +Reply-To: mlemos +Sender: mlemos@acm.org +X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" +Message-ID: <20050430192829.0489.mlemos@acm.org> +Date: Sat, 30 Apr 2005 19:28:29 -0300 + + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" + + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" + + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +This is an HTML message. Please use an HTML capable mail program to read +this message. + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + + + +Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= +TML message + + + + + + + +
+

Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= +ss: HTML message

+
+

Hello Manuel,

+This message is just to let you know that the MIME E-mail message composing and sending PHP class is working as expected.

+

Here is an image embedded in a message as a separate part:

= +
+
Than= +k you,
+mlemos

+
+ + +--69c1683a3ee16ef7cf16edd700694a2f-- + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="logo.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="logo.gif" +Content-ID: + +R0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v/////////////////// +/////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg +qLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto +RBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR +k5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p +m3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo +ZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT +Ol7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri +SSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX +JtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN +RlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV +z1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ +X8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws +YSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC +QwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/ +e1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI +osKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu +soeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV +4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj +VFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277 +7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw== + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="background.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="background.gif" +Content-ID: <4c837ed463ad29c820668e835a270e8a.gif> + +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 +eZmYmZmauZmc2ZlCEQEAOw== + +--6a82fb459dcaacd40ab3404529e808dc-- + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: text/plain; name="attachment.txt" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="attachment.txt" + +VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu +dC50eHQgLg== + +--652b8c4dcb00cdcdda1e16af36781caf-- diff --git a/dms/test/mail02.eml b/dms/test/mail02.eml new file mode 100644 index 000000000..1427cfaea --- /dev/null +++ b/dms/test/mail02.eml @@ -0,0 +1,44 @@ +MIME-Version: 1.0 +Received: by 10.220.191.194 with HTTP; Wed, 11 May 2011 12:27:12 -0700 (PDT) +Date: Wed, 11 May 2011 13:27:12 -0600 +Delivered-To: jncjkq@gmail.com +Message-ID: +Subject: Test +From: Bill Jncjkq +To: bookmarks@jncjkq.net +Content-Type: multipart/mixed; boundary=bcaec54eecc63acce904a3050f79 + +--bcaec54eecc63acce904a3050f79 +Content-Type: multipart/alternative; boundary=bcaec54eecc63acce604a3050f77 + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/plain; charset=ISO-8859-1 + +-- +Bill Jncjkq + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/html; charset=ISO-8859-1 + +
--
Bill Jncjkq
+ +--bcaec54eecc63acce604a3050f77-- +--bcaec54eecc63acce904a3050f79 +Content-Type: text/html; charset=US-ASCII; name="bookmarks-really-short.html" +Content-Disposition: attachment; filename="bookmarks-really-short.html" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_gnknv6u70 + +PCFET0NUWVBFIE5FVFNDQVBFLUJvb2ttYXJrLWZpbGUtMT4KCTxIVE1MPgoJPE1FVEEgSFRUUC1F +UVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoJ +PFRpdGxlPkJvb2ttYXJrczwvVGl0bGU+Cgk8SDE+Qm9va21hcmtzPC9IMT4KCQk8RFQ+PEgzIEZP +TERFRD5UZWNoIE5ld3M8L0gzPgoJCTxETD48cD4KCQkJPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +Y25ldC5jb20vIj5DTmV0PC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJlZC5jb20v +Ij5XaXJlZCBOZXdzPC9BPgoJCTwvREw+PHA+CgkJPERUPjxIMyBGT0xERUQ+VG9vbHMgYW5kIFJl +ZmVyZW5jZTwvSDM+CgkJPERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb25zdGVy +LmNvbS8iPk1vbnN0ZXIuY29tPC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJtZC5j +b20vIj5XZWJNRDwvQT4KCQk8L0RMPjxwPgoJCTxEVD48SDMgRk9MREVEPlRyYXZlbDwvSDM+CgkJ +PERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL2ZvZG9ycy5jb20vIj5Gb2RvcnM8L0E+CgkJ +CTxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRyYXZlbG9jaXR5LmNvbS8iPlRyYXZlbG9jaXR5PC9B +PgoJCTwvREw+PHA+Cgk8L0RMPjxwPgo8L0hUTUw+ +--bcaec54eecc63acce904a3050f79-- diff --git a/dms/test/markdown.md b/dms/test/markdown.md new file mode 100644 index 000000000..721d2b1a4 --- /dev/null +++ b/dms/test/markdown.md @@ -0,0 +1,138 @@ +# An h1 header + +Paragraphs are separated by a blank line. + +2nd paragraph. _Italic_, **bold**, and `monospace`. Itemized lists look like: + +- this one +- that one +- the other one + +Note that --- not considering the asterisk --- the actual text content starts at +4-columns in. + +> Block quotes are written like so. +> +> They can span multiple paragraphs, if you like. + +Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., "it's all in chapters +12--14"). Three dots ... will be converted to an ellipsis. Unicode is supported. + +## An h2 header + +Here's a numbered list: + +1. first item +2. second item +3. third item + +Note again how the actual text starts at 4 columns in (4 characters from the left side). +Here's a code sample: + + # Let me re-iterate ... + for i in 1 .. 10 { do-something(i) } + +As you probably guessed, indented 4 spaces. By the way, instead of indenting the block, +you can use delimited blocks, if you like: + +``` +define foobar() { + print "Welcome to flavor country!"; +} +``` + +(which makes copying & pasting easier). You can optionally mark the delimited block for +Pandoc to syntax highlight it: + +```python +import time +# Quick, count to ten! +for i in range(10): + # (but not *too* quick) + time.sleep(0.5) + print i +``` + +### An h3 header + +Now a nested list: + +1. First, get these ingredients: + + - carrots + - celery + - lentils + +2. Boil some water. + +3. Dump everything in the pot and follow this algorithm: + + find wooden spoon + uncover pot + stir + cover pot + balance wooden spoon precariously on pot handle + wait 10 minutes + goto first step (or shut off burner when done) + + Do not bump wooden spoon or it will fall. + +Notice again how text always lines up on 4-space indents (including that last line which +continues item 3 above). + +Here's a link to [a website](http://foo.bar), to a [local doc](local-doc.html), and to a +[section heading in the current doc](#an-h2-header). Here's a footnote [^1]. + +[^1]: Footnote text goes here. + +Tables can look like this: + +size material color + +--- + +9 leather brown 10 hemp canvas natural 11 glass transparent + +Table: Shoes, their sizes, and what they're made of + +(The above is the caption for the table.) Pandoc also supports multi-line tables: + +--- + +keyword text + +--- + +red Sunsets, apples, and other red or reddish things. + +green Leaves, grass, frogs and other things it's not easy being. + +--- + +A horizontal rule follows. + +--- + +Here's a definition list: + +apples : Good for making applesauce. oranges : Citrus! tomatoes : There's no "e" in +tomatoe. + +Again, text is indented 4 spaces. (Put a blank line between each term/definition pair to +spread things out more.) + +Here's a "line block": + +| Line one | Line too | Line tree + +and images can be specified like so: + +![example image](example-image.jpg "An exemplary image") + +Inline math equations go in like so: $\omega = d\phi / dt$. Display math should get its +own line and be put in in double-dollarsigns: + +$$I = \int \rho R^{2} dV$$ + +And note that you can backslash-escape any punctuation characters which you wish to be +displayed literally, ex.: \`foo\`, \*bar\*, etc. diff --git a/dms/test/sheet01.xls b/dms/test/sheet01.xls new file mode 100644 index 000000000..795ff7c49 Binary files /dev/null and b/dms/test/sheet01.xls differ diff --git a/dms/test/sheet02.csv b/dms/test/sheet02.csv new file mode 100644 index 000000000..f9cf38669 --- /dev/null +++ b/dms/test/sheet02.csv @@ -0,0 +1,100 @@ +1,"Eldon Base for stackable storage shelf, platinum",Muhammed MacIntyre,3,-213.25,38.94,35,Nunavut,Storage & Organization,0.8 +2,"1.7 Cubic Foot Compact ""Cube"" Office Refrigerators",Barry French,293,457.81,208.16,68.02,Nunavut,Appliances,0.58 +3,"Cardinal Slant-D Ring Binder, Heavy Gauge Vinyl",Barry French,293,46.71,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39 +4,R380,Clay Rozendal,483,1198.97,195.99,3.99,Nunavut,Telephones and Communication,0.58 +5,Holmes HEPA Air Purifier,Carlos Soltero,515,30.94,21.78,5.94,Nunavut,Appliances,0.5 +6,G.E. Longer-Life Indoor Recessed Floodlight Bulbs,Carlos Soltero,515,4.43,6.64,4.95,Nunavut,Office Furnishings,0.37 +7,"Angle-D Binders with Locking Rings, Label Holders",Carl Jackson,613,-54.04,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38 +8,"SAFCO Mobile Desk Side File, Wire Frame",Carl Jackson,613,127.70,42.76,6.22,Nunavut,Storage & Organization, +9,"SAFCO Commercial Wire Shelving, Black",Monica Federle,643,-695.26,138.14,35,Nunavut,Storage & Organization, +10,Xerox 198,Dorothy Badders,678,-226.36,4.98,8.33,Nunavut,Paper,0.38 +11,Xerox 1980,Neola Schneider,807,-166.85,4.28,6.18,Nunavut,Paper,0.4 +12,Advantus Map Pennant Flags and Round Head Tacks,Neola Schneider,807,-14.33,3.95,2,Nunavut,Rubber Bands,0.53 +13,Holmes HEPA Air Purifier,Carlos Daly,868,134.72,21.78,5.94,Nunavut,Appliances,0.5 +14,"DS/HD IBM Formatted Diskettes, 200/Pack - Staples",Carlos Daly,868,114.46,47.98,3.61,Nunavut,Computer Peripherals,0.71 +15,"Wilson Jones 1"" Hanging DublLock Ring Binders",Claudia Miner,933,-4.72,5.28,2.99,Nunavut,Binders and Binder Accessories,0.37 +16,Ultra Commercial Grade Dual Valve Door Closer,Neola Schneider,995,782.91,39.89,3.04,Nunavut,Office Furnishings,0.53 +17,"#10-4 1/8"" x 9 1/2"" Premium Diagonal Seam Envelopes",Allen Rosenblatt,998,93.80,15.74,1.39,Nunavut,Envelopes,0.4 +18,Hon 4-Shelf Metal Bookcases,Sylvia Foulston,1154,440.72,100.98,26.22,Nunavut,Bookcases,0.6 +19,"Lesro Sheffield Collection Coffee Table, End Table, Center Table, Corner Table",Sylvia Foulston,1154,-481.04,71.37,69,Nunavut,Tables,0.68 +20,g520,Jim Radford,1344,-11.68,65.99,5.26,Nunavut,Telephones and Communication,0.59 +21,LX 788,Jim Radford,1344,313.58,155.99,8.99,Nunavut,Telephones and Communication,0.58 +22,Avery 52,Carlos Soltero,1412,26.92,3.69,0.5,Nunavut,Labels,0.38 +23,Plymouth Boxed Rubber Bands by Plymouth,Carlos Soltero,1412,-5.77,4.71,0.7,Nunavut,Rubber Bands,0.8 +24,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Carl Ludwig,1539,-172.88,15.99,13.18,Nunavut,Binders and Binder Accessories,0.37 +25,"Maxell 3.5"" DS/HD IBM-Formatted Diskettes, 10/Pack",Carl Ludwig,1539,-144.55,4.89,4.93,Nunavut,Computer Peripherals,0.66 +26,Newell 335,Don Miller,1540,5.76,2.88,0.7,Nunavut,Pens & Art Supplies,0.56 +27,SANFORD Liquid Accent Tank-Style Highlighters,Annie Cyprus,1702,4.90,2.84,0.93,Nunavut,Pens & Art Supplies,0.54 +28,Canon PC940 Copier,Carl Ludwig,1761,-547.61,449.99,49,Nunavut,Copiers and Fax,0.38 +29,"Tenex Personal Project File with Scoop Front Design, Black",Carlos Soltero,1792,-5.45,13.48,4.51,Nunavut,Storage & Organization,0.59 +30,Col-Erase Pencils with Erasers,Grant Carroll,2275,41.67,6.08,1.17,Nunavut,Pens & Art Supplies,0.56 +31,"Imation 3.5"" DS/HD IBM Formatted Diskettes, 10/Pack",Don Miller,2277,-46.03,5.98,4.38,Nunavut,Computer Peripherals,0.75 +32,"White Dual Perf Computer Printout Paper, 2700 Sheets, 1 Part, Heavyweight, 20 lbs., 14 7/8 x 11",Don Miller,2277,33.67,40.99,19.99,Nunavut,Paper,0.36 +33,Self-Adhesive Address Labels for Typewriters by Universal,Alan Barnes,2532,140.01,7.31,0.49,Nunavut,Labels,0.38 +34,Accessory37,Alan Barnes,2532,-78.96,20.99,2.5,Nunavut,Telephones and Communication,0.81 +35,Fuji 5.2GB DVD-RAM,Jack Garza,2631,252.66,40.96,1.99,Nunavut,Computer Peripherals,0.55 +36,Bevis Steel Folding Chairs,Julia West,2757,-1766.01,95.95,74.35,Nunavut,Chairs & Chairmats,0.57 +37,Avery Binder Labels,Eugene Barchas,2791,-236.27,3.89,7.01,Nunavut,Binders and Binder Accessories,0.37 +38,Hon Every-Day Chair Series Swivel Task Chairs,Eugene Barchas,2791,80.44,120.98,30,Nunavut,Chairs & Chairmats,0.64 +39,"IBM Multi-Purpose Copy Paper, 8 1/2 x 11"", Case",Eugene Barchas,2791,118.94,30.98,5.76,Nunavut,Paper,0.4 +40,Global Troy Executive Leather Low-Back Tilter,Edward Hooks,2976,3424.22,500.98,26,Nunavut,Chairs & Chairmats,0.6 +41,XtraLife ClearVue Slant-D Ring Binders by Cardinal,Brad Eason,3232,-11.83,7.84,4.71,Nunavut,Binders and Binder Accessories,0.35 +42,Computer Printout Paper with Letter-Trim Perforations,Nicole Hansen,3524,52.35,18.97,9.03,Nunavut,Paper,0.37 +43,6160,Dorothy Wardle,3908,-180.20,115.99,2.5,Nunavut,Telephones and Communication,0.57 +44,Avery 49,Aaron Bergman,4132,1.32,2.88,0.5,Nunavut,Labels,0.36 +45,Hoover Portapower Portable Vacuum,Jim Radford,4612,-375.64,4.48,49,Nunavut,Appliances,0.6 +46,Timeport L7089,Annie Cyprus,4676,-104.25,125.99,7.69,Nunavut,Telephones and Communication,0.58 +47,Avery 510,Annie Cyprus,4676,85.96,3.75,0.5,Nunavut,Labels,0.37 +48,Xerox 1881,Annie Cyprus,4676,-8.38,12.28,6.47,Nunavut,Paper,0.38 +49,LX 788,Annie Cyprus,4676,1115.69,155.99,8.99,Nunavut,Telephones and Communication,0.58 +50,"Cardinal Slant-D Ring Binder, Heavy Gauge Vinyl",Annie Cyprus,5284,-3.05,8.69,2.99,Nunavut,Binders and Binder Accessories,0.39 +51,"Memorex 4.7GB DVD-RAM, 3/Pack",Clay Rozendal,5316,514.07,31.78,1.99,Nunavut,Computer Peripherals,0.42 +52,Unpadded Memo Slips,Don Jones,5409,-7.04,3.98,2.97,Nunavut,Paper,0.35 +53,"Adams Telephone Message Book W/Dividers/Space For Phone Numbers, 5 1/4""X8 1/2"", 300/Messages",Beth Thompson,5506,4.41,5.88,3.04,Nunavut,Paper,0.36 +54,"Eldon Expressions Desk Accessory, Wood Pencil Holder, Oak",Frank Price,5569,-0.06,9.65,6.22,Nunavut,Office Furnishings,0.55 +55,Bell Sonecor JB700 Caller ID,Michelle Lonsdale,5607,-50.33,7.99,5.03,Nunavut,Telephones and Communication,0.6 +56,Avery Arch Ring Binders,Ann Chong,5894,87.68,58.1,1.49,Nunavut,Binders and Binder Accessories,0.38 +57,APC 7 Outlet Network SurgeArrest Surge Protector,Ann Chong,5894,-68.22,80.48,4.5,Nunavut,Appliances,0.55 +58,"Deflect-o RollaMat Studded, Beveled Mat for Medium Pile Carpeting",Joy Bell,5925,-354.90,92.23,39.61,Nunavut,Office Furnishings,0.67 +59,Accessory4,Joy Bell,5925,-267.01,85.99,0.99,Nunavut,Telephones and Communication,0.85 +60,Personal Creations Ink Jet Cards and Labels,Skye Norling,6016,3.63,11.48,5.43,Nunavut,Paper,0.36 +61,High Speed Automatic Electric Letter Opener,Barry Weirich,6116,-1759.58,1637.53,24.49,Nunavut,"Scissors, Rulers and Trimmers",0.81 +62,Xerox 1966,Grant Carroll,6182,-116.79,6.48,6.65,Nunavut,Paper,0.36 +63,Xerox 213,Grant Carroll,6182,-67.28,6.48,7.86,Nunavut,Paper,0.37 +64,"Boston Electric Pencil Sharpener, Model 1818, Charcoal Black",Adrian Hane,6535,-19.33,28.15,8.99,Nunavut,Pens & Art Supplies,0.57 +65,Hammermill CopyPlus Copy Paper (20Lb. and 84 Bright),Skye Norling,6884,-61.21,4.98,4.75,Nunavut,Paper,0.36 +66,"Telephone Message Books with Fax/Mobile Section, 5 1/2"" x 3 3/16""",Skye Norling,6884,119.09,6.35,1.02,Nunavut,Paper,0.39 +67,Crate-A-Files,Andrew Gjertsen,6916,-141.27,10.9,7.46,Nunavut,Storage & Organization,0.59 +68,"Angle-D Binders with Locking Rings, Label Holders",Ralph Knight,6980,-77.28,7.3,7.72,Nunavut,Binders and Binder Accessories,0.38 +69,"80 Minute CD-R Spindle, 100/Pack - Staples",Dorothy Wardle,6982,407.44,39.48,1.99,Nunavut,Computer Peripherals,0.54 +70,"Bush Westfield Collection Bookcases, Dark Cherry Finish, Fully Assembled",Dorothy Wardle,6982,-338.27,100.98,57.38,Nunavut,Bookcases,0.78 +71,12-1/2 Diameter Round Wall Clock,Dorothy Wardle,6982,52.56,19.98,10.49,Nunavut,Office Furnishings,0.49 +72,SAFCO Arco Folding Chair,Grant Carroll,7110,1902.24,276.2,24.49,Nunavut,Chairs & Chairmats, +73,"#10 White Business Envelopes,4 1/8 x 9 1/2",Barry Weirich,7430,353.20,15.67,1.39,Nunavut,Envelopes,0.38 +74,3M Office Air Cleaner,Beth Paige,7906,271.78,25.98,5.37,Nunavut,Appliances,0.5 +75,"Global Leather and Oak Executive Chair, Black",Sylvia Foulston,8391,-268.36,300.98,64.73,Nunavut,Chairs & Chairmats,0.56 +76,Xerox 1936,Nicole Hansen,8419,70.39,19.98,5.97,Nunavut,Paper,0.38 +77,Xerox 214,Nicole Hansen,8419,-86.62,6.48,7.03,Nunavut,Paper,0.37 +78,Carina Double Wide Media Storage Towers in Natural & Black,Nicole Hansen,8833,-846.73,80.98,35,Nunavut,Storage & Organization,0.81 +79,Staples General Use 3-Ring Binders,Beth Paige,8995,8.05,1.88,1.49,Nunavut,Binders and Binder Accessories,0.37 +80,Xerox 1904,Beth Paige,8995,-78.02,6.48,5.86,Northwest Territories,Paper,0.36 +81,Luxo Professional Combination Clamp-On Lamps,Beth Paige,8995,737.94,102.3,21.26,Northwest Territories,Office Furnishings,0.59 +82,Xerox 217,Beth Paige,8995,-191.28,6.48,8.19,Northwest Territories,Paper,0.37 +83,Revere Boxed Rubber Bands by Revere,Beth Paige,8995,-21.49,1.89,0.76,Northwest Territories,Rubber Bands,0.83 +84,"Acco Smartsocket Table Surge Protector, 6 Color-Coded Adapter Outlets",Sylvia Foulston,9126,884.08,62.05,3.99,Northwest Territories,Appliances,0.55 +85,"Tennsco Snap-Together Open Shelving Units, Starter Sets and Add-On Units",Bryan Davis,9127,-329.49,279.48,35,Northwest Territories,Storage & Organization,0.8 +86,Hon 4070 Series Pagoda Round Back Stacking Chairs,Joy Bell,9509,2825.15,320.98,58.95,Northwest Territories,Chairs & Chairmats,0.57 +87,Xerox 1887,Joy Bell,9509,2.13,18.97,5.21,Northwest Territories,Paper,0.37 +88,Xerox 1891,Joy Bell,9509,707.15,48.91,5.81,Northwest Territories,Paper,0.38 +89,Avery 506,Alan Barnes,9763,75.13,4.13,0.5,Northwest Territories,Labels,0.39 +90,"Bush Heritage Pine Collection 5-Shelf Bookcase, Albany Pine Finish, *Special Order",Grant Carroll,9927,-270.63,140.98,53.48,Northwest Territories,Bookcases,0.65 +91,"Lifetime Advantage Folding Chairs, 4/Carton",Grant Carroll,9927,3387.35,218.08,18.06,Northwest Territories,Chairs & Chairmats,0.57 +92,Microsoft Natural Multimedia Keyboard,Grant Carroll,9927,-82.16,50.98,6.5,Northwest Territories,Computer Peripherals,0.73 +93,"Staples Wirebound Steno Books, 6"" x 9"", 12/Pack",Delfina Latchford,10022,-3.88,10.14,2.27,Northwest Territories,Paper,0.36 +94,"GBC Pre-Punched Binding Paper, Plastic, White, 8-1/2"" x 11""",Don Jones,10437,-191.22,15.99,13.18,Northwest Territories,Binders and Binder Accessories,0.37 +95,Bevis Boat-Shaped Conference Table,Doug Bickford,10499,31.21,262.11,62.74,Northwest Territories,Tables,0.75 +96,"Linden 12"" Wall Clock With Oak Frame",Doug Bickford,10535,-44.14,33.98,19.99,Northwest Territories,Office Furnishings,0.55 +97,Newell 326,Doug Bickford,10535,-0.79,1.76,0.7,Northwest Territories,Pens & Art Supplies,0.56 +98,Prismacolor Color Pencil Set,Jamie Kunitz,10789,76.42,19.84,4.1,Northwest Territories,Pens & Art Supplies,0.44 +99,Xerox Blank Computer Paper,Anthony Johnson,10791,93.36,19.98,5.77,Northwest Territories,Paper,0.38 +100,600 Series Flip,Ralph Knight,10945,4.22,95.99,8.99,Northwest Territories,Telephones and Communication,0.57 diff --git a/dms/test/sheet03.ods b/dms/test/sheet03.ods new file mode 100644 index 000000000..b0c9c6831 Binary files /dev/null and b/dms/test/sheet03.ods differ diff --git a/dms/test/slide01.odp b/dms/test/slide01.odp new file mode 100644 index 000000000..bf8cb46e6 Binary files /dev/null and b/dms/test/slide01.odp differ diff --git a/dms/test/slide02.ppt b/dms/test/slide02.ppt new file mode 100644 index 000000000..0cd4ac593 Binary files /dev/null and b/dms/test/slide02.ppt differ diff --git a/dms/test/text.rst b/dms/test/text.rst new file mode 100644 index 000000000..da5445c91 --- /dev/null +++ b/dms/test/text.rst @@ -0,0 +1,382 @@ +A ReStructuredText Primer +========================= + +:Author: Richard Jones +:Version: $Revision: 5801 $ +:Copyright: This document has been placed in the public domain. + +.. contents:: + + +The text below **contains** links that look like "(quickref__)". These +are relative links that point to the `Quick reStructuredText`_ user +reference. If these links don't work, please refer to the `master +quick reference`_ document. + +__ +.. _Quick reStructuredText: quickref.html +.. _master quick reference: + http://docutils.sourceforge.net/docs/user/rst/quickref.html + +.. Note:: This document is an informal introduction to + reStructuredText. + + +Structure +--------- + +From the **outset**, let me say that "Structured Text" is probably a bit +of a misnomer. It's more like "Relaxed Text" that uses certain +consistent patterns. These patterns are interpreted by a HTML +converter to produce "Very Structured Text" that can be used by a web +browser. + +The most basic pattern recognised is a **paragraph** (quickref__). +That's a chunk of text that is separated by blank lines (one is +enough). Paragraphs must have the same indentation -- that is, line +up at their left edge. Paragraphs that start indented will result in +indented quote paragraphs. For example:: + + This is a paragraph. It's quite + short. + + This paragraph will result in an indented block of + text, typically used for quoting other text. + + This is another one. + +Results in: + + This is a paragraph. It's quite + short. + + This paragraph will result in an indented block of + text, typically used for quoting other text. + + This is another one. + +__ quickref.html#paragraphs + + +Text styles +----------- + +(quickref__) + +__ quickref.html#inline-markup + +Inside paragraphs and other bodies of text, you may additionally mark +text for *italics* with "``*italics*``" or **bold** with +"``**bold**``". This is called "inline markup". + +If you want something to appear as a fixed-space literal, use +"````double back-quotes````". Note that no further fiddling is done +inside the double back-quotes -- so asterisks "``*``" etc. are left +alone. + +If you find that you want to use one of the "special" characters in +text, it will generally be OK -- reStructuredText is pretty smart. +For example, this lone asterisk * is handled just fine, as is the +asterisk in this equation: 5*6=30. If you actually +want text \*surrounded by asterisks* to **not** be italicised, then +you need to indicate that the asterisk is not special. You do this by +placing a backslash just before it, like so "``\*``" (quickref__), or +by enclosing it in double back-quotes (inline literals), like this:: + + ``*`` + +__ quickref.html#escaping + +.. Tip:: Think of inline markup as a form of (parentheses) and use it + the same way: immediately before and after the text being marked + up. Inline markup by itself (surrounded by whitespace) or in the + middle of a word won't be recognized. See the `markup spec`__ for + full details. + +__ ../../ref/rst/restructuredtext.html#inline-markup + + +Lists +----- + +Lists of items come in three main flavours: **enumerated**, +**bulleted** and **definitions**. In all list cases, you may have as +many paragraphs, sublists, etc. as you want, as long as the left-hand +side of the paragraph or whatever aligns with the first line of text +in the list item. + +Lists must always start a new paragraph -- that is, they must appear +after a blank line. + +**enumerated** lists (numbers, letters or roman numerals; quickref__) + __ quickref.html#enumerated-lists + + Start a line off with a number or letter followed by a period ".", + right bracket ")" or surrounded by brackets "( )" -- whatever you're + comfortable with. All of the following forms are recognised:: + + 1. numbers + + A. upper-case letters + and it goes over many lines + + with two paragraphs and all! + + a. lower-case letters + + 1. with a sub-list starting at a different number + 2. make sure the numbers are in the correct sequence though! + + I. upper-case roman numerals + + i. lower-case roman numerals + + (1) numbers again + + 1) and again + + Results in (note: the different enumerated list styles are not + always supported by every web browser, so you may not get the full + effect here): + + 1. numbers + + A. upper-case letters + and it goes over many lines + + with two paragraphs and all! + + a. lower-case letters + + 1. with a sub-list starting at a different number + 2. make sure the numbers are in the correct sequence though! + + I. upper-case roman numerals + + i. lower-case roman numerals + + (1) numbers again + + 1) and again + +**bulleted** lists (quickref__) + __ quickref.html#bullet-lists + + Just like enumerated lists, start the line off with a bullet point + character - either "-", "+" or "*":: + + * a bullet point using "*" + + - a sub-list using "-" + + + yet another sub-list + + - another item + + Results in: + + * a bullet point using "*" + + - a sub-list using "-" + + + yet another sub-list + + - another item + +**definition** lists (quickref__) + __ quickref.html#definition-lists + + Unlike the other two, the definition lists consist of a term, and + the definition of that term. The format of a definition list is:: + + what + Definition lists associate a term with a definition. + + *how* + The term is a one-line phrase, and the definition is one or more + paragraphs or body elements, indented relative to the term. + Blank lines are not allowed between term and definition. + + Results in: + + what + Definition lists associate a term with a definition. + + *how* + The term is a one-line phrase, and the definition is one or more + paragraphs or body elements, indented relative to the term. + Blank lines are not allowed between term and definition. + + +Preformatting (code samples) +---------------------------- +(quickref__) + +__ quickref.html#literal-blocks + +To just include a chunk of preformatted, never-to-be-fiddled-with +text, finish the prior paragraph with "``::``". The preformatted +block is finished when the text falls back to the same indentation +level as a paragraph prior to the preformatted block. For example:: + + An example:: + + Whitespace, newlines, blank lines, and all kinds of markup + (like *this* or \this) is preserved by literal blocks. + Lookie here, I've dropped an indentation level + (but not far enough) + + no more example + +Results in: + + An example:: + + Whitespace, newlines, blank lines, and all kinds of markup + (like *this* or \this) is preserved by literal blocks. + Lookie here, I've dropped an indentation level + (but not far enough) + + no more example + +Note that if a paragraph consists only of "``::``", then it's removed +from the output:: + + :: + + This is preformatted text, and the + last "::" paragraph is removed + +Results in: + +:: + + This is preformatted text, and the + last "::" paragraph is removed + + +Sections +-------- + +(quickref__) + +__ quickref.html#section-structure + +To break longer text up into sections, you use **section headers**. +These are a single line of text (one or more words) with adornment: an +underline alone, or an underline and an overline together, in dashes +"``-----``", equals "``======``", tildes "``~~~~~~``" or any of the +non-alphanumeric characters ``= - ` : ' " ~ ^ _ * + # < >`` that you +feel comfortable with. An underline-only adornment is distinct from +an overline-and-underline adornment using the same character. The +underline/overline must be at least as long as the title text. Be +consistent, since all sections marked with the same adornment style +are deemed to be at the same level:: + + Chapter 1 Title + =============== + + Section 1.1 Title + ----------------- + + Subsection 1.1.1 Title + ~~~~~~~~~~~~~~~~~~~~~~ + + Section 1.2 Title + ----------------- + + Chapter 2 Title + =============== + +This results in the following structure, illustrated by simplified +pseudo-XML:: + +
+ + Chapter 1 Title + <section> + <title> + Section 1.1 Title + <section> + <title> + Subsection 1.1.1 Title + <section> + <title> + Section 1.2 Title + <section> + <title> + Chapter 2 Title + +(Pseudo-XML uses indentation for nesting and has no end-tags. It's +not possible to show actual processed output, as in the other +examples, because sections cannot exist inside block quotes. For a +concrete example, compare the section structure of this document's +source text and processed output.) + +Note that section headers are available as link targets, just using +their name. To link to the Lists_ heading, I write "``Lists_``". If +the heading has a space in it like `text styles`_, we need to quote +the heading "```text styles`_``". + + +Document Title / Subtitle +````````````````````````` + +The title of the whole document is distinct from section titles and +may be formatted somewhat differently (e.g. the HTML writer by default +shows it as a centered heading). + +To indicate the document title in reStructuredText, use a unique adornment +style at the beginning of the document. To indicate the document subtitle, +use another unique adornment style immediately after the document title. For +example:: + + ================ + Document Title + ================ + ---------- + Subtitle + ---------- + + Section Title + ============= + + ... + +Note that "Document Title" and "Section Title" above both use equals +signs, but are distict and unrelated styles. The text of +overline-and-underlined titles (but not underlined-only) may be inset +for aesthetics. + + +Images +------ + +(quickref__) + +__ quickref.html#directives + +To include an image in your document, you use the the ``image`` directive__. +For example:: + + .. image:: https://picsum.photos/200/300/?random + +results in: + +.. image:: https://picsum.photos/200/300/?random + +The ``images/biohazard.png`` part indicates the filename of the image +you wish to appear in the document. There's no restriction placed on +the image (format, size etc). If the image is to appear in HTML and +you wish to supply additional information, you may:: + + .. image:: images/biohazard.png + :height: 100 + :width: 200 + :scale: 50 + :alt: alternate text + +See the full `image directive documentation`__ for more info. + +__ ../../ref/rst/directives.html +__ ../../ref/rst/directives.html#images diff --git a/dms/test/text.txt b/dms/test/text.txt new file mode 100644 index 000000000..e0f98f53f --- /dev/null +++ b/dms/test/text.txt @@ -0,0 +1,27 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus condimentum sagittis lacus, laoreet luctus ligula laoreet ut. Vestibulum ullamcorper accumsan velit vel vehicula. Proin tempor lacus arcu. Nunc at elit condimentum, semper nisi et, condimentum mi. In venenatis blandit nibh at sollicitudin. Vestibulum dapibus mauris at orci maximus pellentesque. Nullam id elementum ipsum. Suspendisse cursus lobortis viverra. Proin et erat at mauris tincidunt porttitor vitae ac dui. + +Donec vulputate lorem tortor, nec fermentum nibh bibendum vel. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent dictum luctus massa, non euismod lacus. Pellentesque condimentum dolor est, ut dapibus lectus luctus ac. Ut sagittis commodo arcu. Integer nisi nulla, facilisis sit amet nulla quis, eleifend suscipit purus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam euismod ultrices lorem, sit amet imperdiet est tincidunt vel. Phasellus dictum justo sit amet ligula varius aliquet auctor et metus. Fusce vitae tortor et nisi pulvinar vestibulum eget in risus. Donec ante ex, placerat a lorem eget, ultricies bibendum purus. Nam sit amet neque non ante laoreet rutrum. Nullam aliquet commodo urna, sed ullamcorper odio feugiat id. Mauris nisi sapien, porttitor in condimentum nec, venenatis eu urna. Pellentesque feugiat diam est, at rhoncus orci porttitor non. + +Nulla luctus sem sit amet nisi consequat, id ornare ipsum dignissim. Sed elementum elit nibh, eu condimentum orci viverra quis. Aenean suscipit vitae felis non suscipit. Suspendisse pharetra turpis non eros semper dictum. Etiam tincidunt venenatis venenatis. Praesent eget gravida lorem, ut congue diam. Etiam facilisis elit at porttitor egestas. Praesent consequat, velit non vulputate convallis, ligula diam sagittis urna, in venenatis nisi justo ut mauris. Vestibulum posuere sollicitudin mi, et vulputate nisl fringilla non. Nulla ornare pretium velit a euismod. Nunc sagittis venenatis vestibulum. Nunc sodales libero a est ornare ultricies. Sed sed leo sed orci pellentesque ultrices. Mauris sollicitudin, sem quis placerat ornare, velit arcu convallis ligula, pretium finibus nisl sapien vel sem. Vivamus sit amet tortor id lorem consequat hendrerit. Nullam at dui risus. + +Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed feugiat semper velit consequat facilisis. Etiam facilisis justo non iaculis dictum. Fusce turpis neque, pharetra ut odio eu, hendrerit rhoncus lacus. Nunc orci felis, imperdiet vel interdum quis, porta eu ipsum. Pellentesque dictum sem lacinia, auctor dui in, malesuada nunc. Maecenas sit amet mollis eros. Proin fringilla viverra ligula, sollicitudin viverra ante sollicitudin congue. Donec mollis felis eu libero malesuada, et lacinia risus interdum. + +Etiam vitae accumsan augue. Ut urna orci, malesuada ut nisi a, condimentum gravida magna. Nulla bibendum ex in vulputate sagittis. Nulla facilisi. Nullam faucibus et metus ac consequat. Quisque tempor eros velit, id mattis nibh aliquet a. Aenean tempor elit ut finibus auctor. Sed at imperdiet mauris. Vestibulum pharetra non lacus sed pulvinar. Sed pellentesque magna a eros volutpat ullamcorper. In hac habitasse platea dictumst. Donec ipsum mi, feugiat in eros sed, varius lacinia turpis. Donec vulputate tincidunt dui ac laoreet. Sed in eros dui. Pellentesque placerat tristique ligula eu finibus. Proin nec faucibus felis, eu commodo ipsum. + +Integer eu hendrerit diam, sed consectetur nunc. Aliquam a sem vitae leo fermentum faucibus quis at sem. Etiam blandit, quam quis fermentum varius, ante urna ultricies lectus, vel pellentesque ligula arcu nec elit. Donec placerat ante in enim scelerisque pretium. Donec et rhoncus erat. Aenean tempor nisi vitae augue tincidunt luctus. Nam condimentum dictum ante, et laoreet neque pellentesque id. Curabitur consectetur cursus neque aliquam porta. Ut interdum nunc nec nibh vestibulum, in sagittis metus facilisis. Pellentesque feugiat condimentum metus. Etiam venenatis quam at ante rhoncus vestibulum. Maecenas suscipit congue pellentesque. Vestibulum suscipit scelerisque fermentum. Nulla iaculis risus ac vulputate porttitor. + +Mauris nec metus vel dolor blandit faucibus et vel magna. Ut tincidunt ipsum non nunc dapibus, sed blandit mi condimentum. Quisque pharetra interdum quam nec feugiat. Sed pellentesque nulla et turpis blandit interdum. Curabitur at metus vitae augue elementum viverra. Sed mattis lorem non enim fermentum finibus. Sed at dui in magna dignissim accumsan. Proin tincidunt ultricies cursus. Maecenas tincidunt magna at urna faucibus lacinia. + +Quisque venenatis justo sit amet tortor condimentum, nec tincidunt tellus viverra. Morbi risus ipsum, consequat convallis malesuada non, fermentum non velit. Nulla facilisis orci eget ligula mattis fermentum. Aliquam vel velit ultricies, sollicitudin nibh eu, congue velit. Donec nulla lorem, euismod id cursus at, sollicitudin et arcu. Proin vitae tincidunt ipsum. Vivamus elementum eleifend justo, placerat interdum nulla rutrum id. + +Phasellus fringilla luctus magna, a finibus justo dapibus a. Nam risus felis, rhoncus eget diam sit amet, congue facilisis nibh. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent consequat euismod diam, eget volutpat magna convallis at. Mauris placerat pellentesque imperdiet. Nulla porta scelerisque enim, et scelerisque neque bibendum in. Proin eget turpis nisi. Suspendisse ut est a erat egestas eleifend at euismod arcu. Donec aliquet, nisi sed faucibus condimentum, nisi metus dictum eros, nec dignissim justo odio id nulla. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Maecenas sollicitudin, justo id elementum eleifend, justo neque aliquet nibh, finibus malesuada metus erat eget neque. Suspendisse nec auctor orci. Aenean et vestibulum nulla. Nullam hendrerit augue tristique, commodo metus id, sodales lorem. Etiam feugiat dui est, vitae auctor risus convallis non. + +Maecenas turpis enim, consectetur eget lectus eu, hendrerit posuere lacus. Praesent efficitur, felis eget dapibus consectetur, nisi massa dignissim enim, nec semper dolor est eu urna. Nullam ut sodales lorem. Aliquam dapibus faucibus diam. Vestibulum vel magna et dolor gravida imperdiet ut sit amet sem. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur elementum metus tincidunt nulla euismod ultricies. Duis elementum nec neque in porttitor. Nulla sagittis lorem elit, et consectetur ante laoreet eu. Maecenas nulla tellus, scelerisque ac erat sed, fermentum dapibus metus. Donec tincidunt fermentum molestie. + +Sed consequat mi at maximus faucibus. Pellentesque aliquet tincidunt sapien vel auctor. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent accumsan nunc eget leo aliquam, facilisis hendrerit turpis egestas. Morbi in ultricies mauris, a eleifend turpis. Quisque fringilla massa iaculis risus ultrices, sit amet tincidunt dui varius. Quisque maximus porta tristique. Proin tincidunt, turpis ut tempor pretium, lectus ipsum ullamcorper leo, ac tincidunt felis dui non leo. Aenean porta augue ligula, non consequat ipsum aliquet et. Suspendisse ut suscipit ex. Pellentesque vitae lacinia arcu. Curabitur eget tincidunt nulla, non bibendum metus. Nullam mi ipsum, eleifend vitae tortor pulvinar, facilisis sollicitudin ipsum. + +Vestibulum molestie risus lorem, at feugiat lorem congue sed. Phasellus ullamcorper laoreet enim, nec aliquam turpis scelerisque et. Etiam dictum metus in elit aliquam dapibus. Vivamus vel lectus velit. Nam sed purus luctus, commodo dui quis, malesuada dui. Nulla porttitor aliquet elit sit amet viverra. Proin tempor nulla urna, non aliquet metus maximus quis. Aliquam ac lectus nec mi aliquam sagittis. Quisque venenatis quam eget nisl tempor, egestas rutrum eros eleifend. Nullam venenatis commodo velit, non tempor mauris fermentum ut. In a metus quis erat cursus sagittis. Donec congue nisl in viverra egestas. + +Vestibulum facilisis ligula magna, eu ornare lectus varius et. Mauris facilisis faucibus quam, quis mollis eros convallis non. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent sit amet rutrum erat. Suspendisse potenti. Donec lorem mi, sagittis a fringilla sit amet, sagittis bibendum mauris. In in diam et lorem rutrum eleifend a et felis. Sed ac magna quis enim faucibus dictum. Suspendisse blandit enim eu ex laoreet gravida. + +Suspendisse sed semper felis. Etiam mattis magna mi, suscipit ullamcorper tellus euismod sed. Aenean congue scelerisque ligula id sodales. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc sem lectus, gravida ac dui non, pharetra posuere leo. Maecenas lacus libero, facilisis et elit vitae, commodo facilisis sem. Vivamus id nisl nulla. Integer at maximus dui. Ut a tincidunt lorem. Vivamus vitae ligula vel lacus cursus condimentum. Phasellus quis mauris lobortis, finibus lorem in, vulputate ex. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed faucibus aliquam metus, quis varius elit porttitor id. Vivamus dignissim sollicitudin scelerisque. Morbi tincidunt, dolor quis vehicula consequat, dui diam condimentum nunc, vitae scelerisque odio libero nec ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; diff --git a/dms/test/vector.svg b/dms/test/vector.svg new file mode 100644 index 000000000..11413434b --- /dev/null +++ b/dms/test/vector.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!-- Generator: Gravit.io --><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="isolation:isolate" viewBox="0 0 250 250" width="250" height="250"><defs><clipPath id="_clipPath_llXK6vhsfjTbW54SAQzuHm194MDf7H3y"><rect width="250" height="250"/></clipPath></defs><g clip-path="url(#_clipPath_llXK6vhsfjTbW54SAQzuHm194MDf7H3y)"><defs><mask id="_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9"><path d="M -21.25 10 L 271.25 10 L 271.25 240 L -21.25 240 L -21.25 10 Z" style="stroke:black;fill:white;stroke-miterlimit:10;"/></mask><mask id="_mask_PMOlF2aP8rrfoLDLWXapKxtbGGQnuraN"><path d="M -21.25 10 L 271.25 10 L 271.25 240 L -21.25 240 L -21.25 10 Z" style="stroke:black;fill:white;stroke-miterlimit:10;"/></mask></defs><g mask="url(#_mask_PMOlF2aP8rrfoLDLWXapKxtbGGQnuraN)"><g mask="url(#_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9)"/></g><g mask="url(#_mask_8YF3kr9IOeRmlealccZwRVRUFQgI7lh9)"><image width="3393" height="2668" transform="matrix(0.086,0,0,0.086,-21.25,10)" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAADUEAAApsCAYAAABaIc3kAAAgAElEQVR4XuzbMREAAAwCseLfdG38kCrgQld2jgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAmGBhbOJRoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgTOC8gQECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECP7iR6UAACAASURBVBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABKwuN0wAAIABJREFUAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSMoPwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJpASOodD3CESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBgBOUHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBICxhBpesRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABIyg/QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWsAIKl2PcAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIGEH5AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE0gJGUOl6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAjKDxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgkBYwgkrXIxwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkZQfoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbSAEVS6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEDCC8gMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECKQFjKDS9QhHgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgIARlB8gQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQCAtYASVrufZt2MaAAAAhGH+Xc/GjjoghRfhCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECAGZf5HAAAgAElEQVRAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDNgiagAACAASURBVECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAt4AS1rkc4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgScoGyAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIG1gBPUuh7hCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBwgrIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTWAk5Q63qEI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEDACcoGCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBBYCzhBresRjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABJygbIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgLeAEta5HOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEnKBsgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBtYAT1Loe4QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQcIKyAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE1gJOUOt6hCNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAwAnKBggQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQWAs4Qa3rEY4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAScoGyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYC3gBLWuRzgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBJygbIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgbWAE9S6HuEIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHCCsgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNYCTlDreoQjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQMAJygYIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEFgLOEGt6xGOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEnKBsgQIAAAQIEYu/uYbSq1v4B36tmBujEUMg/fAQqBgstSGRM/CiIKJzCExEGE4JhjApTMMURRNBiKAbUOERCIgNitBAUQ+FHIphQaHFgKgxKXiyI2AEz1Ouf7TuelyOgM2vPxzPPc+1S9+/ea13roZidfa9FgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0toAmqoZfH4AgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ0ATlN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLaIJq6OUxOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENEH5DRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0NACmqAaenkMjgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABTVB+AwQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQINLSAJqiGXh6DI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBAE5TfAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECDS2gCaqhl8fgCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDQBOU3QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAQwtogmro5TE4AgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQ0QfkNECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECDQ0AKaoBp6eQyOAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAFNUH4DBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAg0tIAmqIZeHoMjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQEATlN8AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQINLaAJqqGXx+AIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIENAE5TdAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBDC2iCaujlMTgCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBDRB+Q0QIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQINDQApqgGnp5DI4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAU1QfgMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECDS0gCaohl4egyNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAQBOU3wABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAg0toAmqoZfH4AgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ0ATlN0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEMLaIJq6OUxOAIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIENEH5DRAgQIAAAQIECBAgQIAAAQIEGkQg5zw3Is5ExKaU0oUGGZZhECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJh2AU1Q074EBkCAAAECBAgQIECAAAECBAgQ+F+BnPOBiHg1IoYiojOldJ0NAQIECBAgQIAAAQIECBAgQIDAxAvknKt3L9VmNC4CBAgQIECAAAECBAgQIECAAIEZIqAJaoYslGESIECAAAECBAgQIECAAAECzS1QfXgTEd/eNsuzKaXqv7kIECBAgAABAgQIECBAgAABAgQmUCDnvDsiXo+IFU7jnkBYpQgQIECAAAECBAgQIECAAAECkyygCWqSgZUnQIAAAQIECBAgQIAAAQIECIxFIOd8JSIe+NO9gymlTWPJu4cAAQIECBAgQIAAAQIECBAgQODvBXLO1buWD0bvHEopdfx9yh0ECBAgQIAAAQIECBAgQIAAAQKNIKAJqhFWwRgIECBAgAABAgQIECBAgACBlha4bffhuzm8kFI60tJAJk+AAAECBAgQIECAAAECBAgQmACBnHPV8HQmIubcVm57SunABJRXggABAgQIECBAgAABAgQIECBAYJIFNEFNMrDyBAgQIECAAAECBAgQIECAAIG/Ehj9+Ob83yg9mlKqPtBxESBAgAABAgQIECBAgAABAgQIFAjknOdGRHUS9+0NUFWlGxHRkVKq/p+LAAECBAgQIECAAAECBAgQIECggQU0QTXw4hgaAQIECBAgQIAAAQIECBAg0PwCOecLEbH8b2bqY5zm/ymYIQECBAgQIECAAAECBAgQIDBJAqMNUNUGM/d6B3M2pdQ5SY9XlgABAgQIECBAgAABAgQIECBAYIIENEFNEKQyBAgQIECAAAECBAgQIECAAIHxCuScd0fE62PMDUVEZ0rp+hjvdxsBAgQIECBAgAABAgQIECBAgEBE5JyPRETX32BsTykdAEaAAAECBAgQIECAAAECBAgQINC4ApqgGndtjIwAAQIECBAgQIAAAQIECBBoYoGc84KIqE6BmjOOaX6eUnpmHPe7lQABAgQIECBAgAABAgQIECDQ0gLj2ISmOol7gQ1oWvrnYvIECBAgQIAAAQIECBAgQIBAgwtogmrwBTI8AgQIECBAgAABAgQIECBAoDkFcs5nImJVwezeTiltK8iJECBAgAABAgQIECBAgAABAgRaSiDnvCkiPhjHpG1AMw4stxIgQIAAAQIECBAgQIAAAQIEplpAE9RUi3seWT/BkgAAIABJREFUAQIECBAgQIAAAQIECBAg0PICOeeqiWl/DYgXUkpHauRFCRAgQIAAAQIECBAgQIAAAQJNLZBz7oiIahOa8ZzCXZmsTSl91tQ4JkeAAAECBAgQIECAAAECBAgQmKECmqBm6MIZNgECBAgQIECAAAECBAgQIDAzBXLOCyLiQsEHOH+e8IqUUlXHRYAAAQIECBAgQIAAAQIECBAgcJtAznnu6PuXBwpgbkTEgpTS9YKsCAECBAgQIECAAAECBAgQIECAwCQKaIKaRFylCRAgQIAAAQIECBAgQIAAAQJ/Fsg5VzsJPz0BMtUHOR0ppSsTUEsJAgQIECBAgAABAgQIECBAgEDTCOScq41jlteY0GBKaVONvCgBAgQIECBAgAABAgQIECBAgMAkCGiCmgRUJQkQIECAAAECBAgQIECAAAECdxPIOT8TEScnUGcoIjrtTDyBokoRIECAAAECBAgQIECAAAECM1og53wkIromYBKPppTOTEAdJQgQIECAAAECBAgQIECAAAECBCZIQBPUBEEqQ4AAAQIECBAgQIAAAQIECBD4K4Gc89yIqE5tmjPBUnYmnmBQ5QgQIECAAAECBAgQIECAAIGZKZBz3hYR+ydo9L+MnsJ9fYLqKUOAAAECBAgQIECAAAECBAgQIFBTQBNUTUBxAgQIECBAgAABAgQIECBAgMBYBHLOn0XE02O5t+CeN1JKuwtyIgQIECBAgAABAgQIECBAgACBphCYhBO4K5e3U0pVY5WLAAECBAgQIECAAAECBAgQIECgAQQ0QTXAIhgCAQIECBAgQIAAAQIECBAg0NwCOefOiPh2kmf5QkrpyCQ/Q3kCBAgQIECAAAECBAgQIECAQMMJ5Jw7IuLMJJzAXc310ZRSVdtFgAABAgQIECBAgAABAgQIECAwzQKaoKZ5ATyeAAECBAgQIECAAAECBAgQaG6BnPPciLgQEQ9M8kxvRERnSql6losAAQIECBAgQIAAAQIECBAg0BICU/DuZSilVDVZuQgQIECAAAECBAgQIECAAAECBKZZQBPUNC+AxxMgQIAAAQIECBAgQIAAAQLNLZBzPhARr07RLKtGqAUppetT9DyPIUCAAAECBAgQIECAAAECBAhMq0DOudoQZvkkD+KNlNLuSX6G8gQIECBAgAABAgQIECBAgAABAn8joAnKT4QAAQIECBAgQIAAAQIECBAgMEkCOefOiPh2ksrfq+zQ6IlQGqGmGN7jCBAgQIAAAQIECBAgQIAAgakVyDkfiYiuKXrqCidwT5G0xxAgQIAAAQIECBAgQIAAAQIE7iGgCcpPgwABAgQIECBAgAABAgQIECAwSQI55ysR8cAklf+rsoMppU3T8FyPJECAAAECBAgQIECAAAECBAhMiUDOeVtE7J+Sh/3vQ4ZSSh1T+DyPIkCAAAECBAgQIECAAAECBAgQ+JOAJig/CQIECBAgQIAAAQIECBAgQIDAJAjknHdHxOslpX/86XIsXbywJHp7ZntK6UDdIvIECBAgQIAAAQIECBAgQIAAgUYTmKbTtysG71sa7cdgPAQIECBAgAABAgQIECBAgEBLCWiCaqnlNlkCBAgQIECAAAECBAgQIEBgKgRyztWuwOdLn9W5dn08/ODy6Nu5o7TEH7m1KaXP6haRJ0CAAAECBAgQIECAAAECBAg0isDoe5czETFnGsZ0IyI6UkrV6d8uAgQIECBAgAABAgQIECBAgACBKRbQBDXF4B5HgAABAgQIECBAgAABAgQINL9AzvlCRCwvmem7h4/GO4cHf4++tv2l6Hp2XUmZPzLVhzmdKaVqPC4CBAgQIECAAAECBAgQIECAwIwWyDnPjYiqAarovUs1+R/OD8XFS5frvHM5m1LqnNGQBk+AAAECBAgQIECAAAECBAgQmKECmqBm6MIZNgECBAgQIECAAAECBAgQINCYAjnn3RHxesnofvzpcjy1Yct/RQ/u2xOPPbKypNwfmV9Gdyi+XqeILAECBAgQIECAAAECBAgQIEBgugVyzlUD1KrScVy99lusGX33curYoZg/777SUttTSgdKw3IECBAgQIAAAQIECBAgQIAAAQJlApqgytykCBAgQIAAAQIECBAgQIAAAQJ3COScF0REderSnBKeNRtfjIuXfv6v6Oz2tjg+0B9LFy8sKflHZiil1FGngCwBAgQIECBAgAABAgQIECBAYDoFcs5HIqKrdAzDI7difXfPf969PPzg8vhwoL+0XHX69oKUkk1nSgXlCBAgQIAAAQIECBAgQIAAAQIFApqgCtBECBAgQIAAAQIECBAgQIAAAQJ3E6izG/HgJyfizf3v3RV22ZJFvzdCtbfNqgM/mFLaVKeALAECBAgQIECAAAECBAgQIEBgOgRyztU7jQ/qPLu7d1d8ffbcf5Xo29kb61Y/UVr285TSM6VhOQIECBAgQIAAAQIECBAgQIAAgfELaIIav5kEAQIECBAgQIAAAQIECBAgQOAOgZzztojYX0Jz9dpvsWbDlrg5PHLPeM3dif+ouz2ldKBkjDIECBAgQIAAAQIECBAgQIAAgekQyDl3RsS3dZ791oGBOPLxp3eUqE7gPnPyozobz6xNKX1WZ2yyBAgQIECAAAECBAgQIECAAAECYxfQBDV2K3cSIECAAAECBAgQIECAAAECBO4qkHNeEBEXImJOCdHz3T3x/b+H/ja6bvWT0bdzx9/e9zc3PJpSOlO3iDwBAgQIECBAgAABAgQIECBAYLIFcs4dEVG9xyh651KN78Tpr6J3b989h/r4qpUx0LendCo3ImJBSul6aQE5AgQIECBAgAABAgQIECBAgACBsQtoghq7lTsJECBAgAABAgQIECBAgAABAncVyDlXO/4+XcIz+MmJeHP/e2OO9u3sjXWrnxjz/Xe5sfo4pzOlVDVtuQgQIECAAAECBAgQIECAAAECDSmQc5472gC1vHSAP/50OZ7asOVv4wf37YnHHln5t/fd44bBlNKm0rAcAQIECBAgQIAAAQIECBAgQIDA2AU0QY3dyp0ECBAgQIAAAQIECBAgQIAAgTsEcs7PRMTJEprhkVvRufa5uDk8Mq748YP98dCK4u9/qmdVx05VjVB2KR6XvJsJECBAgAABAgQIECBAgACBqRLIOVcnQK0qfd7Va7/Fmg1bxvTeZXZ7W5w5+VG0t80qfZyTt0vl5AgQIECAAAECBAgQIECAAAEC4xDQBDUOLLcSIECAAAECBAgQIECAAAECBG4XGN2R+EpEzCmR6e7dFV+fPTfuaPVhzvGB/li6eOG4s7cFzqaUOusUkCVAgAABAgQIECBAgAABAgQITIZAzvlARLxaWrvaeGZ9d09cvPTzmEusW/1k9O3cMeb7/3TjLxHRYcOZUj45AgQIECBAgAABAgQIECBAgMDYBDRBjc3JXQQIECBAgAABAgQIECBAgACBOwRyzkcioquE5pvvzsXWHbtKor9nli1Z9HsjVI0diqsygymlTcWDECRAgAABAgQIECBAgAABAgQITLBAzrl6V/FBnbKlG8/UPH377ZTStjrjliVAgAABAgQIECBAgAABAgQIEPhrAU1QfiEECBAgQIAAAQIECBAgQIAAgQKBnHN1itK3BdGodiPuXPtc3BweKYn/J/P4qpUx0LenVo2IeCGlVDVzuQgQIECAAAECBAgQIECAAAEC0yqQc+6IiPN1BvHWgYE48vGnRSXm3z8vvjh2qM6mM4+mlM4UPVyIAAECBAgQIECAAAECBAgQIEDgbwU0Qf0tkRsIECBAgAABAgQIECBAgAABAv8tkHOeGxEXIuKBEpvevfvixOkvS6J3ZDb98x/xr23ddWv5QKeuoDwBAgQIECBAgAABAgQIECBQSyDnvGD0fcuc0kInTn8VvXv7SuO/52q+axlKKVWNXC4CBAgQIECAAAECBAgQIECAAIFJENAENQmoShIgQIAAAQIECBAgQIAAAQLNLZBzPhARr5bM8ofzQ7F+a09J9J6Zvp29sW71E3Vq3oiIjpTSlTpFZAkQIECAAAECBAgQIECAAAECJQKjG85UJygtL8lXmR9/uhzru3tqn7xd1Tp+sD8eWlE8lDdSSrtL5yFHgAABAgQIECBAgAABAgQIECBwbwFNUH4dBAgQIECAAAECBAgQIECAAIFxCOScOyPi23FE/nPr8MiteGrDlrj667WS+F9mvjh2KJYuXlin7lBEdKaUrtcpIkuAAAECBAgQIECAAAECBAgQGK9AzvmziHh6vLk/7q/euXSufW5CGqCqmsuWLIpTR98vHU6VW5FSqk4RdxEgQIAAAQIECBAgQIAAAQIECEyggCaoCcRUigABAgQIECBAgAABAgQIEGh+gZxz9QFL0VbAbx0YiCMffzopSLPb2+LUsUMxf959dep/nlJ6pk4BWQIECBAgQIAAAQIECBAgQIDAeATqnLhdPadqgKpOgLp46efxPPZv731lc1e8vHnj3953jxuGUkodpWE5AgQIECBAgAABAgQIECBAgACBuwtogvLLIECAAAECBAgQIECAAAECBAiMUSDnvDsiXh/j7f912w/nh2L91p6S6Jgz1S7Fxwf6o71t1pgzd7nx7ZTStjoFZAkQIECAAAECBAgQIECAAAECYxHIOW+KiA/Gcu+97unduy9OnP6yTol7ZmuevL09pXRgUgamKAECBAgQIECAAAECBAgQIECgRQU0QbXowps2AQIECBAgQIAAAQIECBAgMD6BnHO1e+/58aX+7+41G1+c8B2J7zaWx1etjIG+PaXD/CP3QkrpSN0i8gQIECBAgAABAgQIECBAgACBewnUfddS1X338NF45/DgpCFXG86cOvp+af0bEdGRUrpSWkCOAAECBAgQIECAAAECBAgQIEDgvwU0QflFECBAgAABAgQIECBAgAABAgTGIJBzvhARy8dw6x23TPYHOX9+4Cubu+LlzRtLhnp7ZkVKqZqziwABAgQIECBAgAABAgQIECAwoQI55wURUb13mFNa+MTpr6J3b19pfMy517a/FF3Prhvz/X+68WxKqbM0LEeAAAECBAgQIECAAAECBAgQIPDfApqg/CIIECBAgAABAgQIECBAgAABAn8jkHPeFhH7S6B+/OlyPLVhS0m0VqZvZ2+sW/1EnRp2K66jJ0uAAAECBAgQIECAAAECBAjcVSDnPDcizpRuNlMVrd63rO/uiZvDI5OuPLu9LU4dOxTz591X+qztKaUDpWE5AgQIECBAgAABAgQIECBAgACB/xPQBOXXQIAAAQIECBAgQIAAAQIECBD4C4G6OxOv2fhiXLz085QbVx/oHB/oj6WLF9Z59lBEdKaUrtcpIkuAAAECBAgQIECAAAECBAgQ+EMg5/xZRDxdKjI8cis61z43JQ1Qf4zx4QeXx4cD/aVDrjaaWeD9SimfHAECBAgQIECAAAECBAgQIEDg/wQ0Qfk1ECBAgAABAgQIECBAgAABAgT+QiDnXO1MvKoEafCTE/Hm/vdKohOSqRqhzpz8KNrbZtWpN5hS2lSngCwBAgQIECBAgAABAgQIECBAoBLIOe+OiNdLNaoGqOoEqOnYcOa17S9F17PrSof+eUrpmdKwHAECBAgQIECAAAECBAgQIECAwP8KaILySyBAgAABAgQIECBAgAABAgQI3EMg57wtIvaXAF299lus2bBlSnclvts4ly1Z9PuJUDUbod5IKVUfKbkIECBAgAABAgQIECBAgAABAkUCOedqk5UPisKjod69++LE6S/rlCjOTsBmM2tTStUpWC4CBAgQIECAAAECBAgQIECAAIFCAU1QhXBiBAgQIECAAAECBAgQIECAQHML5JznRsSViJhTMtPnu3vi+38PlUQnPLNu9ZPRt3NH3bovpJSO1C0iT4AAAQIECBAgQIAAAQIECLSeQM65IyKq07aL3rNUYtN94nY1hsdXrYyBvj2lC3gjIhaklK6XFpAjQIAAAQIECBAgQIAAAQIECLS6gCaoVv8FmD8BAgQIECBAgAABAgQIECBwV4Gcc7Uz79MlPI3wUc6fx/3K5q54efPGkun8kak+1OlMKV2oU0SWAAECBAgQIECAAAECBAgQaC2BuhvNVFrffHcutu7Y1RBwB/fticceWVk6lsGUUnUilosAAQIECBAgQIAAAQIECBAgQKBAQBNUAZoIAQIECBAgQIAAAQIECBAg0NwCOednIuJkySyHR25F59rn4ubwSEl8UjM1P9KpxmbH4kldIcUJECBAgAABAgQIECBAgEBzCYw2QFUnQC0vndmPP12O9d09DfOuZXZ7W5w5+VG0t80qndKjKaXKxEWAAAECBAgQIECAAAECBAgQIDBOAU1Q4wRzOwECBAgQIECAAAECBAgQINDcAnV3J+7u3RVfnz3XkEjVRzrHB/pj6eKFdcY3NHoi1PU6RWQJECBAgAABAgQIECBAgACB5hfIOR+JiK7SmVabzTy1YUtc/fVaaYlJya1b/WT07dxRWvuXiOhIKXm3UiooR4AAAQIECBAgQIAAAQIECLSsgCaoll16EydAgAABAgQIECBAgAABAgTuJlDn45xvvjsXW3fsamjY+ffPiy+OHaqzW3E1v8GU0qaGnqjBESBAgAABAgQIECBAgAABAtMqkHPeHRGv1xnEmo0vxsVLP9cpMWnZ4wf746EVxQdcvZ1S2jZpg1OYAAECBAgQIECAAAECBAgQINCkApqgmnRhTYsAAQIECBAgQIAAAQIECBAYv0DOuTMivh1/MqLambhz7XNxc3ikJD6lmWVLFsWpo+/Xfeb2lNKBukXkCRAgQIAAAQIECBAgQIAAgeYTyDlXm6d8UGdmvXv3xYnTX9YpManZCdho5tGU0plJHaTiBAgQIECAAAECBAgQIECAAIEmE9AE1WQLajoECBAgQIAAAQIECBAgQIBAmUDOeW5EXIiIB0oqNPqHOX+e07rVT0bfzh0lU709szal9FndIvIECBAgQIAAAQIECBAgQIBA8wjknDsiomrumVM6q8FPTsSb+98rjU9ZbtM//xH/2tZd+rxfUkoLSsNyBAgQIECAAAECBAgQIECAAIFWFNAE1Yqrbs4ECBAgQIAAAQIECBAgQIDAHQI55+pUo1dLaH44PxTrt/aURKc189r2l6Lr2XV1xnAjIjpTSlXzmIsAAQIECBAgQIAAAQIECBBocYHRTWau1GmA+ua7c7F1x64ZI3n8YH88tGJ56XjfSCntLg3LESBAgAABAgQIECBAgAABAgRaTUATVKutuPkSIECAAAECBAgQIECAAAECdwjknDsj4tsSmuGRW/HUhi1x9ddrJfFpzxzctycee2RlnXH8EhEdKaXrdYrIEiBAgAABAgQIECBAgAABAjNfIOdcbZRS3BH040+XY313T9wcHpkxGMuWLIpTR9+vM94VNpipwydLgAABAgQIECBAgAABAgQItJKAJqhWWm1zJUCAAAECBAgQIECAAAECBO4qUOcDnbcODMSRjz+dsbKz29vi+EB/LF28sM4chlJKHXUKyBIgQIAAAQIECBAgQIAAAQIzWyDnfCQiukpnMZM3mnllc1e8vHlj6dS9VymVkyNAgAABAgQIECBAgAABAgRaTkATVMstuQkTIECAAAECBAgQIECAAAECtwvknHdHxOslKtXuxNUpUDP9qnYsrhqh2ttm1ZnKYEppU50CsgQIECBAgAABAgQIECBAgMDMFMg5b4uI/XVG/3x3T3z/76E6JaY1+8WxQ3U2mXkjpVS9o3IRIECAAAECBAgQIECAAAECBAj8hYAmKD8PAgQIECBAgAABAgQIECBAoGUFcs7V6UXnSwHWbHwxLl76uTTeULmHH1weHw701x3T9pTSgbpF5AkQIECAAAECBAgQIECAAIGZI5BzfiYiTtYZce/efXHi9Jd1Skx7ttpk5tTR90vHcSMiOlJKV0oLyBEgQIAAAQIECBAgQIAAAQIEWkFAE1QrrLI5EiBAgAABAgQIECBAgAABAncVyDlfiIjlJTzvHj4a7xweLIk2bGbd6iejb+eOuuN7NKV0pm4ReQIECBAgQIAAAQIECBAgQKDxBUY3mKneA8wpHe2J019F796+0nhD5V7b/lJ0PbuudExnU0qdpWE5AgQIECBAgAABAgQIECBAgEArCGiCaoVVNkcCBAgQIECAAAECBAgQIEDgDoGc87aI2F9C8+NPl+OpDVtKog2f6dvZG+tWP1FnnNXOxZ0pparBzEWAAAECBAgQIECAAAECBAg0qUDOeW5EVH//P1A6xR/OD8X6rT2l8YbLzW5vi1PHDsX8efeVjs0p26VycgQIECBAgAABAgQIECBAgEBLCGiCaollNkkCBAgQIECAAAECBAgQIEDgdoGc84LRj3SKdil+vrsnvv/3UNOiHj/YHw+tKDog6w+TCqdqhLretEgmRoAAAQIECBAgQIAAAQIEWlygzgnbFV21ycz67p64OTzSVJIPP7g8PhzoL51TtblMR0rpSmkBOQIECBAgQIAAAQIECBAgQIBAMwtogmrm1TU3AgQIECBAgAABAgQIECBA4K4COeczEbGqhGfwkxPx5v73SqIzJlPtWnx8oD+WLl5YZ8xnU0qddQrIEiBAgAABAgQIECBAgAABAo0pkHM+EhFdpaMbHrn1ewPUxUs/l5Zo6Nxr21+KrmfXlY7x85TSM6VhOQIECBAgQIAAAQIECBAgQIBAMwtogmrm1TU3AgQIECBAgAABAgQIECBA4A6BnPOmiPighObqtd9izYYtTbdD8d0sli1Z9HsjVHvbrBKqPzKDKaXK20WAAAECBAgQIECAAAECBAg0iUDOeVtE7K8znWY/ZbvaYObMyY/qvFdZm1L6rI6xLAECBAgQIECAAAECBAgQIECgGQU0QTXjqpoTAQIECBAgQIAAAQIECBAgcFeBnPPciLgSEXNKiJr9A50/mzy+amUM9O0pobo980JKqdod2kWAAAECBAgQIECAAAECBAjMcIGcc3VC0ck60+jduy9OnP6yTokZka35XuVGRCxIKV2fEZM1SAIECBAgQIAAAQIECBAgQIDAFAlogpoiaI8hQIAAAQIECBAgQIAAAQIEpl8g51ztoPt0yUhOnP4qevf2lURndGbTP/8R/9rWXXcOj6aUztQtIk+AAAECBAgQIECAAAECBAhMn0DOuSMiqr/vizaXqUbeau9XDu7bE489srJ00T5PKVVNZy4CBAgQIECAAAECBAgQIECAAIFRAU1QfgoECBAgQIAAAQIECBAgQIBASwjU2al4eORWdK59Lm4Oj7SE1Z8n2bezN9atfqLO3KvdiztSStUpXC4CBAgQIECAAAECBAgQIEBghgmMnq5dNUAtLx36D+eHYv3WntL4jMzNbm+LMyc/iva2WaXjt7FMqZwcAQIECBAgQIAAAQIECBAg0JQCmqCacllNigABAgQIECBAgAABAgQIELhdYPRDnaoBp2in4u7eXfH12XMtjfrFsUOxdPHCOgZDEdGZUrpep4gsAQIECBAgQIAAAQIECBAgMPUCOeeqAWpV6ZOvXvst1mzY0pIbzKxb/WT07dxRSvfL6MYy3qeUCsoRIECAAAECBAgQIECAAAECTSWgCaqpltNkCBAgQIAAAQIECBAgQIAAgbsJ5JwPRMSrJTrffHcutu7YVRJtqky1c/GpY4di/rz76szr85TSM3UKyBIgQIAAAQIECBAgQIAAAQJTK5BzPhIRXaVPrU7YXt/dExcv/VxaYsbnjh/sj4dWFB+i9XZKaduMRzABAgQIECBAgAABAgQIECBAgMAECGiCmgBEJQgQIECAAAECBAgQIECAAIHGFcg5d0bEtyUjrD7S6Vz7XEvuUnw3r2VLFsXxgf5ob5tVwvlHxoc7dfRkCRAgQIAAAQIECBAgQIDAFArknDdFxAd1HumE7Yj598+L6pTtGu9UHk0pVadxuQgQIECAAAECBAgQIECAAAECLS2gCaqll9/kCRAgQIAAAQIECBAgQIBAcwvknOdGxIWIeKBkpm8dGIgjH39aEm3azOOrVsZA356683shpVTtIu0iQIAA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wydLgAABAgQIECBAgAABAgQINKKAJqhGXBVjIkCAAAECBAgQIECAAAECBO4qkHOuGl+KtsB99/DReOfwINkGEKi5k3E1g6HRRqjrDTAdQyBAgAABAgQIECBAgAABAg0nMNoAVZ0AVfQepZrQjz9djvXdPXFzeKTh5tcqA3plc1e8vHlj6XSHUkrVSWAuAgQIECBAgAABAgQIECBAgEDTCGiCapqlNBECBAgQIECAAAECBAgQINDcAjnn3RHxesksq492qlOgXI0hMLu9LY4P9MfSxQvrDOhsSqmzTgFZAgQIECBAgAABAgQIECDQrAI55yMR0VU6Pydql8pNfO6LY4fqvEN5I6VUvVNzESBAgAABAgQIECBAgAABAgSaQkATVFMso0kQIECAAAECBAgQIECAAIHmFsg5L4iI/ymd5ZqNL8bFSz+XxuUmQWDZkkW/N0K1t82qU30wpbSpTgFZAgQIECBAgAABAgQIECDQbAJ1NpL5w8K7lMb5VVTvUE4dfb90QDcioiOldKW0gBwBAgQIECBAgAABAgQIECBAoJEENEE10moYCwECBAgQIECAAAECBAgQIHBXgZzzmYhYVcLz7uGj8c7hwZKozCQLPL5qZQz07an7lBdSStXu1i4CBAgQIECAAAECBAgQINDyAjnnarOQD+pA9O7dFydOf1mnhOwEC7yyuSte3ryxtKrTtEvl5AgQIECAAAECBAgQIECAAIGGE9AE1XBLYkAECBAgQIAAAQIECBAgQIDA7QI5520Rsb9E5eq136LzmedKojJTJLDpn/+If23rrvu0R1NKVaOciwABAgQIECBAgAABAgQItKxAzrkjIqq/j+eUIgx+ciLe3P9eaVxukgRmt7fFqWOHYv68+0qfsD2ldKA0LEeAAAECBAgQIECAAAECBAgQaBQBTVCNshLGQYAAAQIECBAgQIAAAQIECNwhkHNeEBEXSj/eeb67J77/9xDZBhfo29kb61Y/UWeUNyKiI6V0pU4RWQIECBAgQIAAAQIECBAgMFMFcs5zI6L6u7i4Aeqb787F1h27ZipB04/74QeXx4cD/aXz9O6kVE6OAAECBAgQIECAAAECBAgQaCgBTVANtRwGQ4AAAQIECBAgQIAAAQIECNwukHOudi9eVaJi5+IStenLfHHsUCxdvLDOAKput86U0vU6RWQJECBAgAABAgQI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bbbxQR2N3r374sTpL+uUkG1hgeMH++OhFctLBd5IKVXv/FwECBAgQIAAAQIECBAgQIAAgWkR0AQ1LeweSoAAAQIECBAgQIAAAQIEmlsg59wREedLZ9m5dn1c/fVaaVyOwH8Eau5w/EedR1NKZ7ASIECAAAECBAgQIECAAIE6AnXfl1TPfvfw0Xjn8GCdYci2uMD8++fFmZPH6yisSCldqFNAlgABAgQIECBAgAABAgQIECBQKqAJqlROjgABAgQIECBAgAABAgQIELinQM65+hCiaEtZH/P4YU20QN/O3li3+ok6ZW9ERKcPfOoQyhIgQIAAAQIECBAgQKC1BXLOCyKiel8yp1TixOmvondvX2lcjsB/BF7Z3BUvb95YKjKUUqo2QHIRIECAAAECBAgQIECAAAECBKZcQBPUlJN7IAECBAgQIECAAAECBAgQaG6BnPPuiHi9ZJY//nQ5ntqwpSQqQ+AvBb44diiWLl5YR2lotBHqep0isgQIECBAgAABAgQIECDQegI557kRUZ0wXLRhTCVWvTNZ390TN4dHWg/QjCdFoOa7kjdSStU7QBcBAgQIECBAgAABAgQIECBAYEoFNEFNKbeHESBAgAABAgQIECBAgACB5haou6vxmo0vxsVLPzc3ktlNi8Ds9rY4dexQzJ93X53nf55SeqZOAVkCBAgQIECAAAECBAgQaD2BnPNnEfF06cyHR25F59rnNECVAsrdVWDZkkVx6uj7dXT+X0rpSp0CsgQIECBAgAABAgQIECBAgACB8QpoghqvmPsJECBAgAABAgQIECBAgACBewrknKtdjVeVEL17+Gi8c3iwJCpDYEwC1cc9xwf6o71t1pjuv8dNb6eUttUpIEuAAAECBAgQIECAAAECrSNQ58TsSqlqgKpOgLJpTOv8ZqZypq9s7oqXN28sfeTZlFJnaViOAAECBAgQIECAAAECBAgQIFAioAmqRE2GAAECBAgQIECAAAECBAgQuEMg51w1huwvobl67bdYs2GLHY1L8GTGJfD4qpUx0LdnXJm73PxCSulI3SLyBAgQIECAAAECBAgQINDcAjnnTRHxQZ1Z9u7dFydOf1mnhCyBvxQ489lHdU7O3p5SOoCYAAECBAgQIECAAAECBAgQIDBVApqgpkracwgQIECAAAECBAgQIECAQBML5JwXRMSFiJhTMs3nu3vi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tPnekaFYua6nJCpDgMAUEei86454qLur7mgWp5SqYkoXAQIECBAgQIAAAQIEpqRAznlZROyvM7jezVti38HX6zQhS4DAJAls2/J43PSrG0p7dxJ2qZwcAQIECBAgQIAAAQIECBCY4gKKoKb4AzI8AgQIECBAgAABAgQIECDwbYGc86KIOFKiMjxyNm5dtTZOfHayJC5DgMAUEujb2Bsrlt5cZ0TVrsiLUkrH6zQiS4AAAQIECBAgQIAAgUYIjL7/OBQRs0rb33fwjejd3FcalyNAYJIFZra3xaH9L0R724zSkdyYUqp+jrgIECBAgAABAgQIECBAgACBJhJQBNVED9NUCBAgQIAAAQIECBAgQKD5BXLO1cktC0tm+uTAYOx88eWSqAwBAlNMoFoItHewPxZcdUWdkQ1FREdK6VSdRmQJECBAgAABAgQIECAwngI559kRUb3/mFfarpOwS+XkCEwtgZqnYX86ugGM9x5T67EaDQECBAgQIECAAAECBAgQqCWgCKoWnzABAgQIECBAgAABAgQIEJg4gZzzpoh4tKTHYx99cu4UKBcBAs0jMA47IlcYr6SUljWPipkQIECAAAECBAgQIDDdBXLO1cktS0rnUb0DWdnVE2eGR0qbkCNAYAoJ7N3WH9ctLtoTqprFUyml7ik0HUMhQIAAAQIECBAgQIAAAQIEagoogqoJKE6AAAECBAgQIECAAAECBCZCIOe8KCKOlPZ12+r74+iHH5fG5QgQmKIC11x95bkTodrbZtQZ4WMpparI0kWAAAECBAgQIECAAIFJFcg574yINaWDGB45e64AyjuQUkE5AlNPYO7lc+K1PdvrvPtYnFKqTpdzESBAgAABAgQIECBAgAABAk0goAiqCR6iKRAgQIAAAQIECBAgQIBA8wvU2QX5mR274+kdu5ofyQwJtKjAiqW3RN/GDXVnf29KqVps6CJAgAABAgQIECBAgMCkCOScOyPiuTqdd/U+Er8//E6dJmQJEJiCAp133REPdXeVjmwopVRtMOUiQIAAAQIECBAgQIAAAQIEmkBAEVQTPERTIECAAAECBAgQIECAAIHmFsg5d0fE1pJZHvvok7h11dqSqAwBAtNI4Lf3rYnf3Le6zohPR0SHnZHrEMoSIECAgVckAgAAIABJREFUAAECBAgQIFAqkHPuiIi3SvNV7smBwdj54st1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Dw4EEEAAAQQQQAABBBBAAAEEAhdgCCpwYhZAAAEEEEAAAQQQQAABBApbwFpbLcndNOZpp4IH123Qm2+5B3FzIIAAAgggULwC9ddfq93btypWVekHYZsxxu0exBExgdSN2+1ed9VMt91tXUNqPTKo/mGbbkikz5va+45qjuxS+d/cg8k5ECgMgeS823Tma/drtGpmYTR0hS7m10xW4taYllxdGmSvZyUluGk3SOLgc6c+l3A7e3m+c7vnveNauW4DD2gJ/nKxAgIIIIBASAVmXzVLbqdqH59L3GiMORbS9igLAQQQQAABBBBAAAEEEECggAQYgiqgi0krCCCAAAIIIIAAAggggEA+BKy1eyXd42Xt115/Q2sffcxLKDEIIIAAAggUnMA3lyzW9rYn/Pb1kDHGDdNwREAgddO2e1r2+iDL7fxwVPGDSR3ruxDkMqHJXTpwWjVHd6nyg6OhqYlCEMimwFhphfrrl6q//lsaK6vIZupQ5mqumzI+DDW9LNCvNd20ZNwY4/6+5YiYgJ/PJVyryYFBNd77AANQEbvulIsAAgggkH2BHzzcpO8/vNpr4i5jzHyvwcQhgAACCCCAAAIIIIAAAgggkK5AoN8WpFsE5yGAAAIIIIAAAggggAACCERTwFq7XNILXqrnJiMvasQggAACCBS6QPN37tMP4+v8tsnTl/0K5iDeWut27XIDUJ5200ynxJPJi4ofGtDePw2nc3rkzykZGVJ1928044/PR74XGkAgHYELlTU603C/zs1bks7pkT6nutwo3lChxxf62jExHYNOSc3GGLfbMUcEBKy1CT/DxO6zCbcDVPe770egW0pEAAEEEEAgeAG3G1TddfO8LrSJHTa90hGHAAIIIIAAAggggAACCCCQrgBDUOlKcR4CCCCAAAIIIIAAAggggMBnBFI7FxyTNMcLzbqWx/Tbzje8hBKDAAIIIIBAQQu0bWzRimV3+OnxrKT53MDthzC4WGttoyR3w3ZDUKucHbFKdA2N/+sftkEtE6q80453qubILpWMDoWqLopBIBcC52vr1begScMzPP1plosSs7bG3Ngktd8+TUuuLs1azssk2uT+X22M6Q96IfJ7F7DWNkt62nsGqWXzFu3Z94qfFMQigAACCCBQUAL111+rl3b9wk9PX+HzCD98xCKAAAIIIIAAAggggAACCEwkwBDUREL8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hKAqQLclAQIECBAgQIAAAQIECJQmEMNB28fuCHFCUvza1TyBGPSKU5/muqdMfWre8amYAAECBAgQIECAAAECQxUQghoqb4sWz/66e/D7H2tRw1olQIAAAQIECAwsIAQ1MJ0HCRAgQIAAgZQE1m+Z+loWwmdT6qkpvQhBNeWk1EmAAAECBAgQIECAAAECyxWIQag4HWps/chyl/L8kAXeuHCxN+Eq/okhKBcBAgQIECBAgAABAgQIEHg3ASEo70UhAtmKbd3ZZ2cKWcsiBAgQIECAAIHEBYSgEj9g7REgQIAAAQL9CWycmBy9lK842d/d7ipSQAiqSE1rESBAgAABAgQIECBAgEATBOJEqBiIihOiTIeq14kdPXX6rfBTvSpTDQECBAgQIECAAAECBAjUUUAIqo6n0rCa8vBc99D0ZMOqVi4BAgQIECBAoDIBIajK6G1MgAABAgQI1E1gw8S23XmePVS3ulKvRwgq9RPWHwECBAgQIECAAAECBAi8n8Bdt9361nSoG1ZeD6sCgTPnzof9hxd64af4tYsAAQIECBAgQIAAAQIECPQrIATVr5T73ksgz7MHThz6/ncIESBAgAABAgQI9CcgBNWfk7sIECBAgACBFgiYBlXNIQtBVeNuVwIECBAgQIAAAQIECBCol0AMQI131vSmQ61dvapexSVazfyJxV7waa67mGiH2iJAgAABAgQIECBAgACBYQsIQQ1bOPn1X+4enB5NvksNEiBAgAABAgQKFBCCKhDTUgQIECBAgEDzBTpbfuE7IeQfbX4nzelACKo5Z6VSAgQIECBAgAABAgQIEChHIIag7t20rvfHdKhizeOkp73zx3rhpzcuXCx2casRIECAAAECBAgQIECAQOsEhKBad+SFNpxl4VPHZ6d3F7qoxQgQIECAAAECiQsIQSV+wNojQIAAAQIElibQmbh/MuSX9y3tKXcvR0AIajl6niVAgAABAgQIECBAgACB1AWuhqE2rlmdeqtD6y+GneLUpz1zL4VXTp8d2j4WJkCAAAECBAgQIECAAIH2CQhBte/MC+zYFKgCMS1FgAABAgQItEdACKo9Z61TAgQIECBAoE+BzuapmZCF+/q83W3LFBCCWiagxwkQIECAAAECBAgQIECgFQK33HTjm9OhRkP82nVtgRh4ilOf5rqnTH26Npc7CBAgQIAAAQIECBAgQGAAASGoAdA8ckUgC491Z6d34SBAgAABAgQIEFiagBDU0rzcTYAAAQIECLRAYP3mX/hYluXfbkGrtWhRCKoWx6AIAgQIECBAgAABAgQIEGiQwHhnpBeIGls/0qCqyyk1Tn3af/hkL/x05tz5cja1CwECBAgQIECAAAECBAi0VkAIqrVHv9zGX7904fLowgszRlYvV9LzBAgQIECAQOsEhKBad+QaJkCAAAECBPoR6GyZWggh3N7Pve5ZnoAQ1PL8PE2AAAECBAgQIECAAAEC7RW4YeX1vTDU9rE7Wj8dav7EYpjrLvYCUC4CBAgQIECAAAECBAgQIFCWgBBUWdKJ7WMKVGIHqh0CBAgQIECgTAEhqDK17UWAAAECBAg0RmDDxNTOPA9PNqbgBhcqBNXgw1M6AQIECBAgQIAAAQIECNRG4K7bbn1rOlQMR7XhipOe9h9e6AWfTH1qw4nrkQABAgQIECBAgAABAvUTEIKq35k0oaLrssvrjs7OxF/O6yJAgAABAgQIEFiigBDUEsHcToAAAQIECLRHwDSocs5aCKocZ7sQIECAAAECBAgQIECAQDsEYgBqvLOmNx1q7epVSTZ94MhCmOue6k1+chEgQIAAAQIECBAgQIAAgSoFhKCq1G/m3lmWP3V8dt/OZlavagIECBAgQIBA9QJCUNWfgQoIECBAgACBmgp0JqZ2hTw8WtPykilLCCqZo9QIAQIECBAgQIAAAQIECNRM4JabbuyFoe7dtC40fTpUnPS0d/5Yb+rTGxcu1kxaOQQIECBAgAABAgQIECDQVgEhqLae/OB9mwI1uJ0nCRAgQIAAAQJRQAjKe0CAAAECBAgQeA+B0XsmV123ckUcP34zpOEJCEENz9bKBAgQIECAAAECBAgQIEDgqkAMQo13RsLY+pHGoMSw0/yJxbBn7qXwyumzjalboQQIECBAgAABAgQIECDQHgEhqPacdRGdmgJVhKI1CBAgQIAAgbYLCEG1/Q3QPwECBAgQIPC+AqZBDf8FEYIavrEdCBAgQIAAAQIECBAgQIDAVYE4HSoGou7dNBri13W8jp463Zv4NNc9ZepTHQ9ITQQIECBAgAABAgQIECDwloAQlJdhSQLZim3d2WdnlvSMmwkQIECAAAECBN4mIATlhSBAgAABAgQIvI/Am9OgfghpeAJCUMOztTIBAgQIECBAgAABAgQIEHg/gTgZaryzJmy9e7RyqDj1KQaf9s4fC2fOna+8HgUQIECAAAECBAgQIECAAIF+BISg+lFyT08gD891D01P0iBAgAABAgQIEFiegBDU8vw8TYAAAQIECLRAYMPEtt15nj3UglYraVEIqhJ2mxIgQIAAAQIECBAgQIAAgbcEblh5fW861PaxO0qfDjV/YvHNqU+LToQAAQIECBAgQIAAAQIECDROQAiqcUdWXcGmQFVnb2cCBAgQIEAgKQEhqKSOUzMECBAgQIDAMAQ2TkyOXspXnBzG2tYMQQjKW0CAAAECBAgQIECAAAECBOojsHb1qrBj/M4wtn4kxHDUMK446Wn/4YVe+MnUp2EIW5MAAQIECBAgQIAAAQIEyhIQgipLuvH7vNw9OF39KO7GM2qAAAECBAgQIBCCEJS3gAABAgQIECDQh4BpUH0gDXiLENSAcB4jQIAAAQIECBAgQIAAAQJDFIgBqPHOmt50qBiMKuI6cORK8OnFV18rYjlrECBAgAABAgQIECBAgACBygWEoCo/gkYUkGXhU8dnp3c3olhFEiBAgAABAgRqLiAEVfMDUh4BAgQIECBQD4HOxP2TIb+8rx7VpFWFEFRa56kbAgQIECBAgAABAgQIEEhP4JabbuyFoe7dtG7J06FeOX22F3yKf964cDE9HB0RIECAAAECBAgQIECAQKsFhKBaffz9Nm8KVL9S7iNAgAABAgQI9CEgBNUHklsIECBAgAABAlGgs3lqJmThPhrFCghBFetpNQIECBAgQIAAAQIECBAgMEyB8c5ILww1tn7kPbeJYaf5E4thz9xLIYagXAQIECBAgAABAgQIECBAIFUBIahUT7bQvj7XPTj9tUJXtBgBAgQIECBAoMUCQlAtPnytEyBAgAABAksTMA1qaV793i0E1a+U+wgQIECAAAECBAgQIECAQH0E4nSoGIa6d9NoiF/H6+ip072JT3PdU6Y+1eeoVEKAAAECBAgQIECAAAECQxQQghoibhpLv37pwuXRhRdm/JaYNM5TFwQIECBAgEANBISganAISiBAgAABAgSaI9DZMrUQQri9ORXXv1IhqPqfkQoJECBAgAABAgQIECBAgMD7CaxdvaoXejpz7jwoAgQIECBAgAABAgQIECDQKgEhqFYd99KbzcJj3dnpXUt/0BMECBAgQIAAAQLvJSAE5d0gQIAAAQIECCxBYMPE1M48D08u4RG3XkNACMorQoAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNFBCCauKplVazKVClUduIAAECBAgQaJOAEFSbTluvBAgQIECAQCECpkEVwvjWIkJQxXpajQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKERCCKse5ibtkWf7U8dl9O5tYu5oJECBAgAABAnUWEIKq8+mojQABAgQIEKilQGfL1CMhhD+uZXENLEoIqoGHpmQCBAgQIECAAAECBAgQIECAAAECBAgQIEDg/2fv/mLzus87wT+HpkxbtizaY8OZNIiohsrKyYWYLGLxIoUoxrsuMBd2ZwFjgUxheoF2F92LagrsFvC0sIwpAnQvtsrNAm2BNb1B9yJYtHKBAeqBQ1FIsKCUTUJdNNZETEQZk04CGw0V/xMt+j2LQ8uS3le0xJfv+f9+CPjC9jnP7/l9ntPCVfXVQ4AAAQIECIQQlI/gkwRGk87+80uLq4QIECBAgAABAgTyFRCCytdTNQIECBAgQGAIBCamZsZHx0ayX6jaOwTXLfyKQlCFEzuAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoQEIIqALUFJW2BasEQXYEAAQIECBCorYAQVG1HozECBAgQIECgzgKT07PHI40X6txjU3oTgmrKpPRJgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAjcLCEH5HrYSSDqdL134/uIyHQIECBAgQIAAgfwFhKDyN1WRAAECBAgQGAIB26DyG7IQVH6WKhEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAeQJCUOVZN+akNE6vnF2YaUy/GiVAgAABAgQINExACKphA9MuAQIECBAgUB+BA9NH59M0ebY+HTWzEyGoZs5N1wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBh2ASGoYf8Ctrh/MnJ0Zem1RTIECBAgQIAAAQLFCAhBFeOqKgECBAgQIDAEAgenZyY20pGLQ3DVQq8oBFUor+IECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJCAEFRBsM0te27lzMJUc9vXOQECBAgQIECg/gJCUPWfkQ4JECBAgACBGgvYBjX4cISgBjdUgQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTKFxCCKt+8zicmSTx3YWlhvs496o0AAQIECBAg0HQBIaimT1D/BAgQIECAQKUCB74yM5WOjPyo0iYafrgQVMMHqH0CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMqYAQ1JAOfutrX1o5szBBhAABAgQIECBAoFgBIahifVUnQIAAAQIEhkBg8vHZxUjiyBBctZArCkEVwqooAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBQsIARVMHCDytsC1aBhaZUAAQIECBBotIAQVKPHp3kCBAgQIECgDgKT00/MRNo5VYdemtiDEFQTp6ZnAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBCC8g1cE7i8sd6ZWF1eXCNCgAABAgQIECBQrIAQVLG+qhMgQIAAAQJDIjB5eHY5Ig4NyXVzvaYQVK6cihEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASQJCUCVB1/2YJF5cWVo4Xvc29UeAAAECBAgQaIOAEFQbpugOBAgQIECAQOUCB6Zn59I0Xqq8kQY2IATVwKFpmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgRCCMpHEBG2QPkMCBAgQIAAAQIlCghBlYjtKAIECBAgQKDdApOHZ1cjYl+7b5n/7YSg8jdVkQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSKFxCCKt647iekEd/86ZmFY3XvU38ECBAgQIAAgbYICEG1ZZLuQYAAAQIECFQuYBvUzkYgBLUzN28RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQLUCQlDV+tfh9NGks//80mL2h+b6IUCAAAECBAgQKEFACKoEZEcQIECAAAECwyMweXh2LSL2Ds+NB7+pENTghioQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQPkCQlDlm9fpxCRJX76wdGquTj3phQABAgQIECDQdgEhqLZP2P0IECBAgACBUgUmp2ePRxovlHpoww8Tgmr4ALVPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBIRUQghrSwV+7ti1Qwz1/tydAgAABAgSqERCCqsbdqQQIECBAgEBLBSamZsZHx0ayNee2QW1zxkJQ24TyGAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAjUSkAIqlbjKLeZNE6vnF2YKfdQpxEgQIAAAQIECAhB+QYIECBAgAABAjkLfO7w7Ikk4g9zLtvackJQrR2tixEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBDpL1CqAAAgAElEQVQgQKDVAkJQrR7v7S+XjBxdWXptcYgFXJ0AAQIECBAgUImAEFQl7A4lQIAAAQIE2ixwcHpmYiMdudjmO+Z5NyGoPDXVIkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGyBISgypKu2Tm2QNVsINohQIAAAQIEhklACGqYpu2uBAgQIECAQGkCB6aPzqdp8mxpBzb4ICGoBg9P6wQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEBhiASGo4Rx+ksRzF5YW5ofz9m5NgAABAgQIEKhWQAiqWn+nEyBAgAABAi0VsA1q+4MVgtq+lScJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoD4CQlD1mUWJnVxaObMwUeJ5jiJAgAABAgQIELhJQAjK50CAAAECBAgQKEhg8vHZxUjiSEHlW1NWCKo1o3QRAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIDJWAENRQjXvzsrZADd/M3ZgAAQIECBCol4AQVL3moRsCBAgQIECgRQKT00/MRNo51aIrFXIVIahCWBUlQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgYIFhKAKBq5f+csrZxbG69eWjggQIECAAAECwyMgBDU8s3ZTAgQIECBAoAIB26DujC4EdWcjTxAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA/QSEoOo3k0I7SuLFlaWF44WeoTgBAgQIECBAgMBtBYSgfCAECBAgQIAAgQIFDkzPzqVpvFTgEY0vLQTV+BG6AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBIZSQAhqqMZ+eWO9M7G6vLg2VLd2WQIECBAgQIBAzQSEoGo2EO0QIECAAAEC7ROYPDy7GhH72nezfG4kBJWPoyoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUK6AEFS53pWeZgtUpfwOJ0CAAAECBAh8LCAE5VsgQIAAAQIECBQsYBvU7YGFoAr+AJUnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgUIEhKAKYa1l0dGks//80mL2h+D6IUCAAAECBAgQqFBACKpCfEcTIECAAAECwyNgG9Qnz1oIanj+58BNCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0CYBIag2TfOT75Ik6csXlk7NDcdt3ZIAAQIECBAgUG8BIah6z0d3BAgQIECAQEsEJqdnj0caL7TkOrleQwgqV07FCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAkASGokqArPsYWqIoH4HgCBAgQIECAwE0CQlA+BwIECBAgQIBACQITUzPjo2Mj2Vr0vSUc16gjhKAaNS7NEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMA1ASGoYfgUkldWznzn6WG4qTsSIECAAAECBJogIATVhCnpkQABAgQIEGiFgG1QW49RCKoVn7dLECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYOgEhKCGYOTJyNGVpdcWh+CmrkiAAAECBAgQaISAEFQjxqRJAgQIECBAoA0CB6dnJjbSkYttuEuedxCCylNTLQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoS0AIqizpis5J4/TK2YWZik53LAECBAgQIECAwBYCQlA+CwIECBAgQIBAiQIHpo/Op2nybIlH1v4oIajaj0iDBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILCFgBBUuz+LNE1+56dnv3Oy3bd0OwIECBAgQIBAswSEoJo1L90SIECAAAECDRewDerWAQpBNfyj1j4BAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSGVEAIqtWDv7RyZmGi1Td0OQIECBAgQIBAAwWEoBo4NC0TIECAAAECzRaYPPy1kxHpU82+RX7dC0HlZ6kSAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJQnIARVnnXZJyVJPHdhaWG+7HOdR4AAAQIECBAgcHsBIShfCAECBAgQIECgZIHJ6SdmIu2cKvnY2h4nBFXb0WiMAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBG4jIATV2s/DFqjWjtbFCBAgQIAAgaYLCEE1fYL6J0CAAAECBBopMPn47GIkcaSRzefctBBUzqDKESBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEApAkJQpTBXcci/XTmzcKKKg51JgAABAgQIECBwewEhKF8IAQIECBAgQKACAdugbqALQVXwATqSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAYWEIIamLCOBS5vrHcmVpcX1+rYnJ4IECBAgAABAsMuIAQ17F+A+xMgQIAAAQKVCUwenl2NiH2VNVCTg4WgajIIbRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAXwJCUH1xNePhJF5cWVo43oxmdUmAAAECBAgQGD4BIajhm7kbEyBAgAABAjURODA9O5em8VJN2qmsDSGoyugdTIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIDCAhBDYBX01c31jsP2gJV0+FoiwABAgQIECAQEUJQPgMCBAgQIECAQIUCtkFFCEFV+AE6mgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgR2LCAEtWO6Wr6YJOnLF5ZOzdWyOU0RIECAAAECBAhsCghB+RAIECBAgAABAhUKTB6ePRYRf1FhC5UfLQRV+Qg0QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI7EBCC2gFajV8ZTTr7zy8trta4Ra0RIECAAAECBIZeQAhq6D8BAAQIECBAgECVAhNTM+OjYyPZL6DtrbKPKs8WgqpS39kECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgsFMBIaidytXvPVug6jcTHREgQIAAAQIEthIQgvJdECBAgAABAgQqFpicnj0eabxQcRuVHS8EVRm9gwkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgAAEhqAHw6vZqMnJ0Zem1xbq1pR8CBAgQIECAAIFuASEoXwQBAgQIECBAoGKBa9ugflVxG5UdLwRVGb2DCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQGAAASGoAfDq9Goap1fOLszUqSW9ECBAgAABAgQIbC0gBOXLIECAAAECBAjUQODA9NH5NE2erUErpbcgBFU6uQMJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAIAcBIagcEOtQwhaoOkxBDwQIECBAgACBbQkIQW2LyUMECBAgQIAAgWIFDk7PTGykIxeLPaWe1YWg6jkXXREgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDA7QWEoFrxhVxaObMw0YqbuAQBAgQIECBAYAgEhKCGYMiuSIAAAQIECDRDYFi3QQlBNeP71CUBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIdAsIQTX/i0iSeO7C0sJ882/iBgQIECBAgACB4RAQghqOObslAQIECBAg0ACByeknZiLtnGpAq7m2KASVK6diBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFCSgBBUSdDFHWMLVHG2KhMgQIAAAQIEChEQgiqEVVECBAgQIECAwM4EJh+fXYwkjuzs7Wa+JQTVzLnpmgABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAsMuIATV7C/AFqhmz0/3BAgQIECAwHAKCEEN59zdmgABAgQIEKipwDBugxKCqunHqC0CBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQuK2AEFSjP5DLG+udidXlxbVG30LzBAgQIECAAIEhExCCGrKBuy4BAgQIECBQf4HJw7PLEXGo/p3m06EQVD6OqhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAuQJCUOV653paEi+uLC0cz7WmYgQIECBAgAABAoULCEEVTuwAAgQIECBAgEB/AgemZ+fSNF7q763mPi0E1dzZ6ZwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLDLCAE1djp2wLV2NFpnAABAgQIEBh2ASGoYf8C3J8AAQIECBCopcDk4dnViNhXy+ZybkoIKmdQ5QgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgFAEhqFKYcz8kSdKXLyydmsu9sIIECBAgQIAAAQKFCwhBFU7sAAIECBAgQIBA/wLDtA1KCKr/78MbBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFC9gBBU9TPYSQejSWf/+aXF7A+n9UOAAAECBAgQINAwASGohg1MuwQIECBAgMBwCExMzYyPjo1kv+C2t+03FoJq+4TdjwABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAu0UEIJq3lxtgWrezHRMgAABAgQIELhZQAjK90CAAAECBAgQqKnA5PTs8UjjhZq2l1tbQlC5USpEgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAiUKCEGViJ3TUUmn86UL319czqmcMgQIECBAgAABAiULCEGVDO44AgQIECBAgMB2BYZlG5QQ1Ha/CM8RIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQJ0EhKDqNI1t9JLG6ZWzCzPbeNIjBAgQIECAAAECNRUQgqrpYLRFgAABAgQIEMgEDkwfnU/T5Nk2awhBtXm67kaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIH2CghBNWy2ycjRlaXXFhvWtXYJECBAgAABAgRuEhCC8jkQIECAAAECBGoscHB6ZmIjHblY4xYHbk0IamBCBQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgAgEhqArQd3qkLVA7lfMeAQIECBAgQKBWAkJQtRqHZggQIECAAAECtwq0fRuUEJSvngABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSaKCAE1ZypJUk8d2FpYb45HeuUAAECBAgQIEBgKwEhKN8FAQIECBAgQKDmAge+MjOVjoz8qOZt7rg9Iagd03mRAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCoUEIKqEL+/oy+tnFmY6O8VTxMgQIAAAQIECNRRQAiqjlPREwECBAgQIECgR2Dy8dnFSOJIG2GEoNo4VXciQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA+wWEoJoxY1ugmjEnXRIgQIAAAQIEtiMgBLUdJc8QIECAAAECBCoWmJx+YibSzqmK2yjkeCGoQlgVJUCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGCBYSgCgbOp/zllTML4/mUUoUAAQIECBAgQKBqASGoqifgfAIECBAgQIDANgXaug1KCGqbH4DHCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKBWAkJQtRrH1s0k8eLK0sLxBnSqRQIECBAgQIAAgW0ICEFtA8kjBAgQIECAAIE6CByYnp1L03ipDr3k2YMQVJ6aahEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAWQJCUGVJ7/icyxvrnYnV5cW1HVfwIgECBAgQIECAQK0EhKBqNQ7NECBAgAABAgRuLzB5eHY1Iva1yUkIqk3TdBcCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgMj4AQVL1nnUZ886dnFo7Vu0vdESBAgAABAgQI9CMgBNWPlmcJECBAgAABAhULtHEblBBUxR+V4wkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgRwJCUDtiK+2l0aSz//zSYvaHzfohQIAAAQIECBBoiYAQVEsG6RoECBAgQIDA8AhMHp7N1rTvbcuNhaDaMkn3IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwHAJCEHVd95Jkr58YenUXH071BkBAgQIECBAgMBOBISgdqLmHQIECBAgQIBAhQKT07PHI40XKmwh16OFoHLlVIwAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEShIQgioJegfH2AK1AzSvECBAgAABAgQaICAE1YAhaZEAAQIECBAgcLPAxNTM+OjYSLauvRXboISgfN8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg0EQBIaiaTi2N0ytnF2Zq2p22CBAgQIAAAQIEBhAQghoAz6sECBAgQIAAgaoEPnd49kQS8YdVnZ/nuUJQeWqqRYAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJlCQhBlSXd5znJyNGVpdcW+3zL4wQIECBAgAABAg0QEIJqwJC0SIAAAQIECBDoFTg4PTOxkY5cbIOMEFQbpugOBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQGD4BIagaztwWqBoORUsECBAgQIAAgfwEhKDys1SJAAECBAgQIFCqwIHpo/Npmjxb6qEFHCYEVQCqkgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQuIAQVOHEfR+Qpsnv/PTsd072/aIXCBAgQIAAAQIEGiEgBNWIMWmSAAECBAgQIHCrQFu2QQlB+boJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoIkCQlC1m9qllTMLE7XrSkMECBAgQIAAAQK5CQhB5UapEAECBAgQIECgfIHJw187GZE+Vf7J+Z0oBJWfpUoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJ6AEFR51ts5KUniuQtLC/PbedYzBAgQIECAAAECzRQQgmrm3HRNgAABAgQIENgUmJx+YibSzqkmcwhBNXl6eidAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMDwCghB1Wr2tkDVahyaIUCAAAECBAgUIyAEVYyrqgQIECBAgACB0gQmH59djCSOlHZgzgcJQeUMqhwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlCIgBFUK8/YOSeLFlaWF49t72FMECBAgQIAAAQJNFRCCaurk9E2AAAECBAgQuCbwuce/9nSSpH/XVBAhqKZOTt8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAYbgEhqNrM//LGemdidXlxrTYdaYQAAQIECBAgQKAQASGoQlgVJUCAAAECBAiUKzB5eHY1IvaVe2o+pwlB5eOoCgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUKyAEVa73J55mC1RNBqENAgQIECBAgEDxAkJQxRs7gQABAgQIECBQuMCB6dm5NI2XCj+ogAOEoApAVZIAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEChcQgiqceFsHjCad/eeXFrM/PNYPAQIECBAgQIBAywWEoFo+YNcjQIAAAQIEhkegqdughKCG5xt1UwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECLRJQAiq+mkmSfryhaVTc9V3ogMCBAgQIECAAIEyBISgylB2BgECBAgQIECgBIHJ6dnjkcYLJRyV6xFCULlyKkaAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECJQkIQZUEfZtjbIGqfgY6IECAAAECBAiUKSAEVaa2swgQIECAAAECBQpMTM2Mj46NZOvd9xZ4TO6lhaByJ1WQAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBEoQEIIqAfk2R9gCVa2/0wkQIECAAAECVQgIQVWh7kwCBAgQIECAQEECTdwGJQRV0MegLAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgUKiAEVSjvnYsnI0dXll5bvPODniBAgAABAgQIEGiLgBBUWybpHgQIECBAgACBiDg4PTOxkY5cbBKGEFSTpqVXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEPhYQAiqwm8hjdMrZxdmKuzA0QQIECBAgAABAhUICEFVgO5IAgQIECBAgECRAgemj86nafJskWfkWVsIKk9NtQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgLAEhqLKktzjHFqgK8R1NgAABAgQIEKhOQAiqOnsnEyBAgAABAgQKEWjaNighqEI+A0UJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoGABIaiCgT+5/KWVMwsTlZ3uYAIECBAgQIAAgcoEhKAqo3cwAQIECBAgQKA4gSZtgxKCKu47UJkAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEihMQgirO9naVkySeu7C0MF/N6U4lQIAAAQIECBCoUkAIqkp9ZxMgQIAAAQIEChKYnH5iJtLOqYLK51pWCCpXTsUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCQBIaiSoLuPsQWqEnaHEiBAgAABAgTqISAEVY856IIAAQIECBAgkLvA5OOzi5HEkdwL51xQCCpnUOUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoBQBIahSmHsP+bcrZxZOVHKyQwkQIECAAAECBCoXEIKqfAQaIECAAAECBAgUI9CUbVBCUMXMX1UCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQKFZACKpY3y2qX95Y70ysLi+ulX6yAwkQIECAAAECBGohIARVizFoggABAgQIECBQjMDk4dnViNhXTPV8qgpB5eOoCgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUKyAEVa53JPHiytLC8ZJPdRwBAgQIECBAgECNBISgajQMrRAgQIAAAQIE8hY4MD07l6bxUt5186wnBJWnploECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJaAEFRZ0h+ds7HeedAWqHLNnUaAAAECBAgQqJuAEFTdJqIfAgQIECBAgEDOAnXfBiUElfPAlSNAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBUgSEoEph3jwkSdKXLyydmivvRCcRIECAAAECBAjUUUAIqo5T0RMBAgQIECBAIEeBycOzxyLiL3IsmWspIahcORUjQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZIEhKBKgo6I0aSz//zS4mp5JzqJAAECBAgQIECgjgJCUHWcip4IECBAgAABAjkKTEzNjI+OjWS/ELg3x7K5lRKCyo1SIQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoUUAIqhxsW6DKcXYKAQIECBAgQKAJAkJQTZiSHgkQIECAAAECAwpMTs8ejzReGLBMIa8LQRXCqigBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIFCwgBFUw8LXySafzpQvfX1wu5zSnECBAgAABAgQI1FlACKrO09EbAQIECBAgQCAngTpvgxKCymnIyhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAqQJCUCVwp3F65ezCTAknOYIAAQIECBAgQKABAkJQDRiSFgkQIECAAAECeQgcmD46n6bJs3nUyrOGEFSemmoRIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQFkCQlAlSCcjR1eWXlss4SRHECBAgAABAgQINEBACKoBQ9IiAQIECBAgQCAPgYPTMxMb6cjFPGrlWUMIKk9NtQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgLAEhqMKlz62cWZgq/BQHECBAgAABAgQINEZACKoxo9IoAQIECBAgQGBwgTpugxKCGnyuKhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBA+QJCUMWaJ0k8d2FpYb7YU1QnQIAAAQIECBBokoAQVJOmpVcCBAgQIECAwIACB74yM5WOjPxowDK5vi4ElSunYgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBQkoAQVKHQl1bOLEwUeoLiBAgQIECAAAECjRMQgmrcyDRMgAABAgQIEBhMYPLx2cVI4shgVfJ7WwgqP0uVCBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKA8ASGo4qxtgSrOVmUCBAgQIECAQJMFhKCaPD29EyBAgAABAgR2IDA5/cRMpJ1TO3i1kFeEoAphVZQAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEChYQgioM+PLGemdidXlxrbATFCZAgAABAgQIEGikgBBUI8emaQIECBAgQIDAYAKTh2eXI+LQYFXyeVsIKh9HVQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECgXAEhqIK8k3hxZWnheEHVlSVAgAABAgQIEGiwgBBUg4endQIECBAgQIDATgUOTM/OpWm8tNP383xPCCpPTbUIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAoCwBIahCpG2BKoRVUQIECBAgQIBAOwSEoNoxR7cgQIAAAQIECPQtMHl4duYoTfAAACAASURBVDUi9vX9Ys4vCEHlDKocAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECJQiIASVP3Ma8c2fnlk4ln9lFQkQIECAAAECBNogIATVhim6AwECBAgQIEBgBwJ12QYlBLWD4XmFAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBCoXEILKfwSjSWf/+aXF7A919UOAAAECBAgQIEDgFgEhKB8FAQIECBAgQGBIBSamZsZHx0ayXzjcWyWBEFSV+s4mQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgZ0KCEHtVG7r95IkffnC0qm5fKuqRoAAAQIECBAg0CYBIag2TdNdCBAgQIAAAQJ9CkxOzx6PNF7o87VcHxeCypVTMQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAoSUAIKl9oW6Dy9VSNAAECBAgQINBGASGoNk7VnQgQIECAAAEC2xSowzYoIahtDstjBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIFArASGoHMeRxumVswszOVZUigABAgQIECBAoIUCQlAtHKorESBAgAABAgT6Efjc4dkTScQf9vNOns8KQeWpqRYBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIlCUgBJWjdDJydGXptcUcKypFgAABAgQIECDQQgEhqBYO1ZUIECBAgAABAv0IHJyemdhIRy72806ezwpB5ampFgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAiUJSAElZO0LVA5QSpDgAABAgQIEGi/gBBU+2fshgQIECBAgACBOwocmD46n6bJs3d8sIAHhKAKQFWSAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAoXEILKhzhJ4rkLSwvz+VRThQABAgQIECBAoM0CQlBtnq67ESBAgAABAgS2KVDlNighqG0OyWMECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUCsBIahcxnFp5czCRC6VFCFAgAABAgQIEGi9gBBU60fsggQIECBAgACB7QlMPj67GEkc2d7T+T0lBJWfpUoECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgUJ6AENTg1rZADW6oAgECBAgQIEBgmASEoIZp2u5KgAABAgQIELiNwOT0EzORdk6VjSQEVba48wgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEAgDwEhqIEVL6+cWRgfuIoCBAgQIECAAAECQyMgBDU0o3ZRAgQIECBAgMCdBarYBtWmENSdhT1BgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTqJ/Bv/uCP4swPz5XbWBIvriwtHC/3UKcRIECAAAECBAg0WUAIqsnT0zsBAgQIECBAIGeBA9Ozc2kaL+Vc9rblhKDK1HYWAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBC4VaCCENTljfXOxOry4pp5ECBAgAABAgQIENiugBDUdqU8R4AAAQIECBAYEoHJw7OrEbGvrOsKQZUl7RwCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQILC1QOkhKFugfIoECBAgQIAAAQI7EBCC2gGaVwgQIECAAAECbRYoexuUEFSbvyZ3I0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEmCJQdghpNOvvPLy1mf0irHwIECBAgQIAAAQLbFhCC2jaVBwkQIECAAAECwyNQ5jYoIajh+a7clAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgTqKVBmCCpJ0pcvLJ2aq6eErggQIECAAAECBOosIARV5+nojQABAgQIECBQkcDk9OzxSOOFMo4XgipD2RkECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQOCTBcoMQdkC5UskQIAAAQIECBDYqYAQ1E7lvEeAAAECBAgQaLHAxNTM+OjYSLZ2fm/R1xSCKlpYfQIE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cbYqDyYgALVzPwGondt5s94C6w/ui87du6832bt9KfsX73/qC12XaPr2paomkoWe5h67N458eldVLdx87uVs41NEnEiSZLkODemBAAECBAgQIECAAAECBAgQIECAQNkCQlBlizuPAAECBAgQIECAAAECBAgQIECgcoE0TSciIgtEZX91//HnFXR3+YM05l/PtkNdieW3NirooP1HbrVxqncr1a5334zRd97swrCVqv3fRhNvKAhV3NQEoYqzVXlnAgJQO3PL3hKA2rmdN4sT2Gr7Um84qXf7UtZN74am4jpUOROYeng0jh3aHU//5ljsvbsWv6Xi9LWNT9nmJz8ECBAgQIAAAQIECBAgQIAAAQIEhlqgFr9iN9QTcHkCBAgQIECAAAECBAgQIECAAIFKBdI0nbkWhso2RO2ttJmIOPfWRpw4916cvLgea+tp1e04v0egdyvV5sapW4JTP+5666N33mNJIFcBQahcObuKffPvvxc/WPl5cQeoTGCbAp99ZDyef2Y2do/VYvvINruux2MCUPWYQ9u62Ljv4bh6/yPXr9W5+77INjLd/NO7fWnjvke63mmbSZvuMz6WxNzBeyPb/HTo4dE6XO1SFny6Fn5arUNDeiBAgAABAgQIECBAgAABAgQIECBQBwEhqDpMQQ8ECBAgQIAAAQIECBAgQIAAAQKVC6RpOh4RWRAq2w51pPKGIuLl81c2w1Anf7Zeh3b0kJPAVlup7v1Fd3CqdyvVR+9kvw/SD4EbAoJQxXwN761fjW98eyHeeHOtmANUJbANAQGobSB9wiMCUDu3a/Ob7z/6WNf1ercvbQaaHuoJND36hTaTuNs1gWzb09P7x+LZg/fUxeTla8Gnxbo0pA8CBAgQIECAAAECBAgQIECAAAECdRIQgqrTNPRCgAABAgQIECBAgAABAgQIECBQC4E0TSci4ti1UFT374asoMNLb38Y8+evxPzrV2L17Q8r6MCRdRS495c9wamerVRbha1sparjJAfrSRBqML9PelsQqhhXVbcnIAC1Pafep95+5934+h/8Ubz+k5WdFfBWLQW2s31p/aGJ6Ny9+3r/ti/VcpS1ampiz11x7NC9kQWg9u25qw69nYuIExFxMkkSKew6TEQPBAgQIECAAAECBAgQIECAAAECtRUQgqrtaDRGgAABAgQIECBAgAABAgQIECBQB4E0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u+mU7iYANaUXp+0iBbY+bMXWeiseb9wppb8nEdGrqqpXSkP6IECAAAECBAgQIECAAAECBAgQIECAgBCUd4AAAQIECBAgQIAAAQIECBAgQIAAgWIEUkqPhmGoPCFquenG8l/u3tl/E71X/Tjqp6bbsT+B4gUEoeq9IkGoej1Hqfbnf/wH8Z3fydlcn8sEBKAuE/LPCVwusLa0EJ37dwZTn1aXFi5/YPwr9t+Z+nQ0/u3sQIAAAQIECBAgQIAAAQIECBAgQIAAgasJCEFdzctqAgQIECBAgAABAgQIECBAgAABAgQmIJBSWomIHITK06EeTmDLS7d48uJsEIbqvexfutYCAvMsIAhV7+0LQtXr+XXVBKBGtxaAGt3KSgJfJpBDT537i/Hw/fdKADrOE58iYqeqqr0SGtIDAQIECBAgQIAAAQIECBAgQIAAAQIEvkpACMq7QYAAAQIECBAgQIAAAQIECBAgQIBA0QIppTySY3sYilptutnDk4vovjiL7vOzODi5aLod+xMoUkAQqt5rEYSq1/PLqglAjW4sADW6lZUE3hXIfzZut+/G1oetWL5dxNf0uzn8VFVV100RIECAAAECBAgQIECAAAECBAgQIEBgWgSK+O3qtGDpkwABAgQIECBAgAABAgQIECBAgACBZgVSSnk6VP553Gwnv9792aefRff56WBC1FE/ldCSHggUIyAIVe9V/PxfDuIv/ubv6y2q2kDgo//+3+JPH/0ejREEBKBGQLKEwDsCK60qOhuLsd1ejNWlhRJsDiMih566VVUdlNCQHggQIECAAAECBAgQIECAAAECBAgQIHAVASGoq2hZS4AAAQIECBAgQIAAAQIECBAgQIBAEQIppZWI6Ax/2k03dXyeoveyP5gQ9fST86bbsT+BYgQEoeq9CkGoej1ztT/81nr82Ue/X3/hGawoADWDl+pIYxPI0546G3dic701tj2uWPjJMPj09IrPWU6AAAECBAgQIECAAAECBAgQIECAAIGiBISgiroOzRAgQIAAAQIECBAgQIAAAQIECBAgcFWBlNKDdwJRy1d9vu71hycXsbN/OghFHZxc1F1ePQJTJyAIVe+VCULV5ykANbqlANToVlbOr8Da0sJg4lMOQBUy9Wk/InYioldV1dH83oyTEyBAgAABAgQIECBAgAABAgQIECAwSwJCULN0m85CgAABAgQIECBAgAABAgQIECBAYM4FUkpbw0DUZgkUu6/6X0yIKqEfPRBoSkAQql55QaibewpAjW745MVZdP72V6M/YCWBORJYaVWxtd6Kzv3FePj+eyWc/DhPfBpOfdoroSE9ECBAgAABAgQIECBAgAABAgQIECBAoE4BIag6NdUiQIAAAQIECBAgQIAAAQIECBAgQKAIgZTSWkTkQNR2RKw23dTxeYru89PovjiLvddvm27H/gQaERCEqpf9r5/+U3z8j/9ab9E5qfbNb6zED7//3bjbKiKwULS6AFTR16O5BgXyn2nb7buDqU/Lt4v4yn13GHzqNchiawIECBAgQIAAAQIECBAgQIAAAQIECIxdoIjfyI79lDYgQIAAAQIECBAgQIAAAQIECBAgQGBuBVJKD4ZhqByKWm4aYv/120EYqvviNI76qel27E9gogKCUPVy/+XH/xB/98+v6i0649UEoEa/YAGo0a2snA+BtaWFQehpu70Yq0sLJRz6MCJ2IqJXVdVBCQ3pgQABAgQIECBAgAABAgQIECBAgAABAuMWEIIat7D6BAgQIECAAAECBAgQIECAAAECBAgUIZBSWhlOh+oyRcpwAAAgAElEQVRExMMSmtp91R8Eonov+yW0owcCExEQhKqXWRBqdE8BqNGtBKBGt7Jy9gVy8KmzcSc211slHPY4h56GU5+eltCQHggQIECAAAECBAgQIECAAAECBAgQIDBJASGoSWrbiwABAgQIECBAgAABAgQIECBAgACBIgRSSmsRkcNQ+We16aYOTy4GQaid/dM4OLlouh37Exi7gCBUvcSCUJd7CkBdbvT5CgGo0a2snF2BPPUpT3zq3F+M5dtFfKW+/87Up6PZlXcyAgQIECBAgAABAgQIECBAgAABAgQIfL1AEb+xdUkECBAgQIAAAQIECBAgQIAAAQIECBBoSiCl9GgYhnrcVA/v7rv/+m3s7L+J3qt+HPVTCS3pgcBYBPJfMO/9yXK0790aS/15K/qjv/o4fvFLfy/+y+79buu9+OH3vxs5COXz9QICUN6QeRZYaVWxtd6K7fbdUv5sOhxOfdqpqupgnu/G2QkQIECAAAECBAgQIECAAAECBAgQIPC5gBCUd4EAAQIECBAgQIAAAQIECBAgQIAAAQIRkVLKfzt+KyK2I6LdNMrxeRpMh+q+OIunn5w33Y79CYxFIP+F86dbv13KXzYfyxknVfRN/7P4yU9/Jgj1H8AFoEZ/AwWgRreycrYEHn1wOzobd2Lrw1YpU592I6JbVVVvtqSdhgABAgQIECBAgAABAgQIECBAgAABAjcXEIK6uaEKBAgQIECAAAECBAgQIECAAAECBAjMmEBKaW0YhsqhqNWmj3d4cjEIQ3Wfn8XByUXT7difQK0CglD1cQpC/aalANTo75YA1OhWVs6GQJ5G2Ll/ZxB+Wl1aKOFQeerTzjD8ZKxfCTeiBwIECBAgQIAAAQIECBAgQIAAAQIEihQQgiryWjRFgAABAgQIECBAgAABAgQIECBAgEApAimlHITqRMRmCT09+/Sz6D4/HYSifAjMioAgVH03KQj175Y//sFH8c1v5CF/Pl8nIADl/Zgngc8nPm2ut0o49nFE5GlPO1VV7ZXQkB4IECBAgAABAgQIECBAgAABAgQIECBQuoAQVOk3pD8CBAgQIECAAAECBAgQIECAAAECBIoQSCnlv0mfw1D5p910U8fnKXov+7Gz/yb2Xr9tuh37E7ixgCDUjQm/KPD6V/8nfvRXH0cORM3r58//+A/iO7+Th/r5fJ2AAJT3Yx4EHty7NZj41Lm/GMu3i/h6/Fme+JQDUFVVmfo0Dy+hMxIgQIAAAQIECBAgQIAAAQIECBAgUJtAEb/lre00ChEgQIAAAQIECBAgQIAAAQIECBAgQGACAimlBxGxHRF5StTyBLb82i0OTy5iZz9PhzqNo35quh37E7i2gCDUten+04O/+OVR/OSnP5vLIJQA1GjvkQDUaE5WTadA/vNka70V2+270b53q4RDHA6DT92qqg5KaEgPBAgQIECAAAECBAgQIECAAAECBAgQmEYBIahpvDU9EyBAgAABAgQIECBAgAABAgQIECBQjEBKKU+GymGozRKa2n3Vj+6Ls8GUKB8C0yggCFXfrc1jEEoAarT3RwBqNCerpk9g68PWIPz0eONOKc0/GU586pXSkD4IECBAgAABAgQIECBAgAABAgQIECAwzQJCUNN8e3onQIAAAQIECBAgQIAAAQIECBAgQKAYgZTS2jAMlSdErTbd2PF5iu7zPB3qLPZev226HfsTuJKAINSVuL528TwFob737d+N7337W/XhzWglAagZvdg5Ptba0kJ07t+JzsadWF1aKEFi/52pT0clNKQHAgQIECBAgAABAgQIECBAgAABAgQIzIqAENSs3KRzECBAgAABAgQIECBAgAABAgQIECBQjEBK6VFEfD4harnpxvZfv42d/TfRe9WPo35quh37ExhJQBBqJKaRFv3j//4kdnZ/PtLaaV30h99ajz/76Pentf2J9S0ANTFqG01AIIeeOvcX4+H7701gt0u3OM4TnyJip6qqvUtXW0CAAAECBAgQIECAAAECBAgQIECAAAEC1xIQgroWm4cIECBAgAABAgQIECBAgAABAgQIECBwuUBKaWU4HSoHoh5e/sT4V+S/AJ/DUL2X/fFvZgcCNxQQhLoh4DuP//xfDuIv/ubv6ytYUCUBqNEuQwBqNCeryhZ4cO9WbLfvxtaHrVi+XcRX3c/y1Keqqrply+mOAAECBAgQIECAAAECBAgQIECAAAECsyFQxG+GZ4PSKQgQIECAAAECBAgQIECAAAECBAgQIPDVAimltYjYHoaiVpu2Ojy5iO6Ls+g+P4uDk4um27E/ga8UEISq7+WYxSCUANRo74cA1GhOVpUpkP8c6GwsRp781L53q4QmD3PwaRh+OiihIT0QIECAAAECBAgQIECAAAECBAgQIEBgXgSEoOblpp2TAAECBAgQIECAAAECBAgQIECAAIFiBFJKW8Mw1OMSmnr26WfRfX46mBB11E8ltKQHAr8hIAhV3wsxS0Gob35jJX78g4/qw5nRSgJQM3qxc3CsPO0pB58211ulnPbJMPj0tJSG9EGAAAECBAgQIECAAAECBAgQIECAAIF5ExCCmrcbd14CBAgQIECAAAECBAgQIECAAAECBIoRSCmtDMNQeUJUu+nGjs9T9F72BxOinn5y3nQ79ifwGwKCUPW9EH/99J/i43/81/oKNlApB6B++P3vxt3Wew3sPj1bCkBNz13p9NcCa0sLsd1ejByAWl1aKIFlPyJ2IqJXVdVRCQ3pgQABAgQIECBAgAABAgQIECBAgAABAvMsIAQ1z7fv7AQIECBAgAABAgQIECBAgAABAgQIFCOQUnoQEZ3hz3LTjR2eXMTO/ukgFHVwctF0O/YnMBAQhKrvRfjLj/8h/u6fX9VXcIKVBKBGwxaAGs3JquYF8n/bt9Zb0bm/GA/fLyLYeJwnPg2nPu01L6QDAgQIECBAgAABAgQIECBAgAABAgQIEPhcQAjKu0CAAAECBAgQIECAAAECBAgQIECAAIHCBFJKW8Mw1GYJre2+6n8xIaqEfvQw3wKCUPXd/zQGoQSgRrt/AajRnKxqVuDBvVux3b47mPq0fLuIr613hxOfcgDKhwABAgQIECBAgAABAgQIECBAgAABAgQKFCjit8kFumiJAAECBAgQIECAAAECBAgQIECAAAECjQuklNYiIgeitiNitemGjs9TdJ+fRvfFWey9ftt0O/afYwFBqPouf5qCUHdb78UPv//dyEEon68WEIDydpQskP/73dlYjO32YqwuLZTQ6mFE7AzDTwclNKQHAgQIECBAgAABAgQIECBAgAABAgQIEPhqASEobwcBAgQIECBAgAABAgQIECBAgAABAgSmQCCl9GAYhsqhqOWmW95//XYQhuq+OI2jfmq6HfvPoYAgVH2X/qO/+jh+8cuj+gqOoZIA1Gio/+NvfzX4b7MPgdIE8rSnzsad2FxvldDacQ49RUS3qqqnJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBAYTUAIajQnqwgQIECAAAECBAgQIECAAAECBAgQIFCMQEqpExH552EJTe2+6g/+0n3vZb+EdvQwRwKCUPVc9pv+Z/GTn/6s2CCUANRo9ywANZqTVZMTWFtaGEx86txfjOXbRXwtvf/O1Keyk5+TuyY7ESBAgAABAgQIECBAgAABAgQIECBAYKoEivht81SJaZYAAQIECBAgQIAAAQIECBAgQIAAAQKFCKSU1oZhqByIWm26rcOTi0EQamf/NA5OLppux/5zIiAIVc9FlxyE+vEPPopvfmOlnoPOaBUBqBm92Ck8Vv5v8tZ6K7bbd6N971YJJ8hTn7o5/FRV1UEJDemBAAECBAgQIECAAAECBAgQIECAAAECBK4vIAR1fTtPEiBAgAABAgQIECBAgAABAgQIECBAoBiBlNKjYSDqcQlN7b9+Gzv7b6L3qh9H/VRCS3qYYQFBqHout8Qg1J//8R/Ed34n5z19vkpAAMq7UYLAow9uR2fjTmx92Cpl6tNuDj9VVdUrwUcPBAgQIECAAAECBAgQIECAAAECBAgQIFCPgBBUPY6qECBAgAABAgQIECBAgAABAgQIECBAoAiBlFIel7IVEdsR0W66qePzNJgO1X1xFk8/OW+6HfvPsIAgVD2X+/pX/yd+9FcfRw5ENf0RgLr8BgSgLjeyYnwCa0sLg9DTdnsxVpcWxrfR6JUP88SnYfjpaPTHrCRAgAABAgQIECBAgAABAgQIECBAgACBaREQgpqWm9InAQIECBAgQIAAAQIECBAgQIAAAQIEriiQUsrjU3IYKoeiVq/4eO3LD08uBmGo7vOzODi5qL2+ggRyEGrnO0vxeOMOjBsI/OKXR/GTn/6s0SCUANTlFygAdbmRFeMR+Hzi0+Z6azwbXK3qcUTkaU87VVXtXe1RqwkQIECAAAECBAgQIECAAAECBAgQIEBg2gSEoKbtxvRLgAABAgQIECBAgAABAgQIECBAgACBawiklHIQqhMRm9d4vPZHnn36WXSfnw5CUT4E6hbo/tFvCULdELXJINT3vv278b1vf+uGJ5jtxwWgZvt+Szzdg3u3IoefOvcXY/l2EV8xP8sTn3IAqqoqU59KfGn0RIAAAQIECBAgQIAAAQIECBAgQIAAgTEIFPEb6jGcS0kCBAgQIECAAAECBAgQIECAAAECBAgQ+BKBlNLKMAyVA1HtppGOz1P0XvZjZ/9N7L1+23Q79p8hAUGom19mE0GoP/zWevzZR79/8+ZnuIIA1AxfbmFHy9P1ttZbsd2+G+17t0ro7vCdqU8HJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBCYrIAQ1GS97UaAAAECBAgQIECAAAECBAgQIECAAIFiBFJKDyJiOyLylKjlphs7PLmInf08Heo0jvqp6XbsPwMCglA3v8R//N+fxM7uz29eaIQKAlCXIwlAXW5kxc0FHn1wezD16fHGnZsXq6fCbp76VFVVr55yqhAgQIAAAQIECBAgQIAAAQIECBAgQIDAtAoIQU3rzembAAECBAgQIECAAAECBAgQIECAAAECNQqklPJkqByG2qyx7LVL7b7qR/fF2WBKlA+BmwgIQt1E79fP/vxfDuIv/ubvb17oayoIQF3OKwB1uZEV1xdYW1qIzv07g/DT6tLC9QvV9+R+Dj4Nw09H9ZVViQABAgQIECBAgAABAgQIECBAgAABAgSmWUAIappvT+8ECBAgQIAAAQIECBAgQIAAAQIECBCoWSCltDYMQ+UJUas1l79yuePzFN3neTrUWey9fnvl5z1AIAsIQt38PRhnEOqb31iJH//go5s3OcMVBKBm+HIbPloOPXXuL8bD999ruJPB9scRkac97VRVtVdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAgbIEhKDKug/dECBAgAABAgQIECBAgAABAgQIECBAoBiBlNKjiPh8QtRy043tv34bO/tvoveqH0f91HQ79p8yAUGom1/YOIJQOQD1w+9/N+62ighg3BxpDBUEoMaAOuclH9y7Fdvtu7H1YSuWbxfxdfGz4cSnPPnJhwABAgQIECBAgAABAgQIECBAgAABAgQIfKVAEb/Vdj8ECBAgQIAAAQIECBAgQIAAAQIECBAgUK5ASmllOB0qB6IeltDpkxdngzBU72W/hHb0MCUCglA3v6i/fvpP8fE//uvNC0WEANTljAJQlxtZMZrASquKzsZi5MlP7Xu3RntovKsOc/BpGH46GO9WqhMgQIAAAQIECBAgQIAAAQIECBAgQIDArAgIQc3KTToHAQIECBAgQIAAAQIECBAgQIAAAQIEJiCQUlqLiO1hKGp1Alt+7RaHJxfRfXEW3edncXBy0XQ79p8CAUGom1/SX378D/F3//zqRoUEoC7nE4C63MiKywXytKet9VY83rhz+eLJrHgSEb2qqnqT2c4uBAgQIECAAAECBAgQIECAAAECBAgQIDBLAkJQs3SbzkKAAAECBAgQIECAAAECBAgQIECAAIEJCqSUtoZhqMcT3PYrt3r26WfRfX46mBB11E8ltKSHQgUEoW5+MTcJQt1tvRc//P53B5OgfL5cQADKm3ETgbWlhejcvzOY+rS6tHCTUnU9ux8RO8Pw01FdRdUhQIAAAQIECBAgQIAAAQIECBAgQIAAgfkTEIKavzt3YgIECBAgQIAAAQIECBAgQIAAAQIECNQqkFLKSYYciMoTotq1Fr9GsePzFL2X/cGEqKefnF+jgkfmQUAQ6ua3fJ0glADU5e4CUJcbWfGfBVZa1WDiU+f+Yjx8/70SiI4jopt/qqraK6EhPRAgQIAAAQIECBAgQIAAAQIECBAgQIDA9AsIQU3/HToBAQIECBAgQIAAAQIECBAgQIAAAQIEihFIKT2IiM7wZ7npxg5PLmJn/3QQijo4uWi6HfsXJiAIdfML+dFffRy/+OVog10EoC73FoC63MiK3xR4cO9WbLfvxtaHrVi+XcRXv7vDiU85AOVDgAABAgQIECBAgAABAgQIECBAgAABAgRqFSjiN+G1nkgxAgQIECBAgAABAgQIECBAgAABAgQIEChCIKWUp0PlQNRmCQ3tvup/MSGqhH70UIaAINTN7uFN/7P4yU9/NlIQ6sc/+Ci++Y08OM7nywQEoLwXowrkqU+djcXYbi/G6tLCqI+Nc93hO1OfDsa5kdoECBAgQIAAAQIECBAgQIAAAQIECBAgMN8CQlDzff9OT4AAAQIECBAgQIAAAQIECBAgQIAAgbELpJTWIiIHorYjYnXsG16ywfF5iu7z0+i+OIu912+bbsf+BQgIQt3sEkYJQv35H/9BfOd38n8KfL5MQADKezGKQJ721Nm4E5vrrVGWj3vNcZ74lMNPVVU9Hfdm6hMgQIAAAQIECBAgQIAAAQIECBAgQIAAgSwgBOU9IECAAAECBAgQIECAAAECBAgQIECAAIGJCaSUHgzDUDkUtTyxjb9io/3XbwdhqO6L0zjqp6bbsX+DAoJQN8P/uiCUANTX2wpA3ezdm/Wn15YWBhOfcgCqkKlP+xGxkwNQVVUdzbq/8xEgQIAAAQIECBAgQIAAAQIECBAgQIBAWQJCUGXdh24IECBAgAABAgQIECBAgAABAgQIECAwNwIppU5E5J+HJRx691V/EIjqveyX0I4eGhAQhLoZeg5C/d//z/8X+X8//whAfb2pANTN3rlZfXqlVcXWeiu223ejfe9WCcfMU5+6OfxUVdVBCQ3pgQABAgQIECBAgAABAgQIECBAgAABAgTmU0AIaj7v3akJECBAgAABAgQIECBAgAABAgQIECBQjEBKaW0YhsqBqNWmGzs8uRgEoXb2T+Pg5KLpduw/YQFBqJuB/+KXR/GTn/5sEIT63rd/N7737W/drOCMPn18nuLR//tvsff67Yye0LGuI/Dog9vR2bgzmPq0fLuIr3F3c/ipqqredc7jGQIECBAgQIAAAQIECBAgQIAAAQIECBAgULdAEb89r/tQ6hEgQIAAAQIECBAgQIAAAQIECBAgQIDAdAqklB4NA1GPSzjB/uu3sbP/Jnqv+nHUTyW0pIcJCAhC3Qw5B6H+7p9fxZ8++r2bFZrRpwWgZvRir3mstaWFQehpu70Yq0sL16xS62OHeeJTRPRMfarVVTECBAgQIECAAAECBAgQIECAAAECBAgQqEFACKoGRCUIECBAgAABAgQIECBAgAABAgQIECBAoF6BlNJKRGxFxHZEtOutfvVqObSQp0N1X5zF00/Or17AE1MnIAg1dVc2FQ0LQE3FNU2kyRx8ylOfNtdbE9nvkk2Oc+hpOPXpaQkN6YEAAQIECBAgQIAAAQIECBAgQIAAAQIECHyZgBCU94IAAQIECBAgQIAAAQIECBAgQIAAAQIEihZIKa0Nw1A5FLXadLOHJxeDMFT3+VkcnFw03Y79xyggCDVG3DksLQA1h5f+H4784N6tQfCpc38xlm8X8TXtsxx8Gk59OnJDBAgQIECAAAECBAgQIECAAAECBAgQIECgdIEifrteOpL+CBAgQIAAAQIECBAgQIAAAQIECBAgQKAMgZRSDkJ1ImKzhI6effpZdJ+fDkJRPrMpIAg1m/c66VMJQE1avJz9VlpVbK23Yrt9N9r3bpXQ2OFw6tNOVVUHJTSkBwIECBAgQIAAAQIECBAgQIAAAQIECBAgMKqAENSoUtYRIECAAAECBAgQIECAAAECBAgQIECAQDECKaWVYRgqB6LaTTeWAw69l/3Y2X8Te6/fNt2O/WsWyOGF//md/1JzVeXmRUAAal5u+jfP+eiD24OpT4837pQCsJunPlVV1SulIX0QIECAAAECBAgQIECAAAECBAgQIECAAIGrCghBXVXMegIECBAgQIAAAQIECBAgQIAAAQIECBAoSiCl9CAitiMiT4labrq5w5OL2NnP06FO46ifmm7H/jUJ5DDD//qj36qpmjLzIiAANS83/etzri0tROf+nUH4aXVpoYTD56lPO8Pw01EJDemBAAECBAgQIECAAAECBAgQIECAAAECBAjcREAI6iZ6niVAgAABAgQIECBAgAABAgQIECBAgACBogRSSnkyVA5DbZbQ2O6rfnRfnA2mRPlMv4Ag1PTf4SRPIAA1Se1m98r/bdj6sBWb661mG/n17scRkac97VRVtVdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1CQhB1SWpDgECBAgQIECAAAECBAgQIECAAAECBAgUI5BSWhuGofKEqNWmG8thiO7zPB3qLPZev226HfvfQEAQ6gZ4c/SoANTsX/aDe7cGE5869xdj+XYRX7k+G0586s6+vhMSIECAAAECBAgQIECAAAECBAgQIECAwLwKFPEb+XnFd24CBAgQIECAAAECBAgQIECAAAECBAgQGL9ASulRRHw+IWp5/Dt+/Q77r9/Gzv6b6L3qx1E/Nd2O/a8hIAh1DbQ5ekQAanYve6VVRWdjcRB+at+7VcJBD3PwaRh+OiihIT0QIECAAAECBAgQIECAAAECBAgQIECAAIFxCghBjVNXbQIECBAgQIAAAQIECBAgQIAAAQIECBAoRiCltDKcDpUDUQ9LaOzJi7NBGKr3sl9CO3q4goAg1BWw5mipANRsXvbWh63YWm/F4407pRzwSUT0qqrqldKQPggQIECAAAECBAgQIECAAAECBAgQIECAwCQEhKAmoWwPAgQIECBAgAABAgQIECBAgAABAgQIEChKIKW0FhHbw1DUatPNHZ5cRPfFWXSfn8XByUXT7dh/RAFBqBGh5mSZANRsXfTa0kJ07t8ZTH1aXVoo4XD770x9OiqhIT0QIECAAAECBAgQIECAAAECBAgQIECAAIFJCwhBTVrcfgQIECBAgAABAgQIECBAgAABAgQIECBQlEBKaWsYhnpcQmPPPv0sus9PBxOijvqphJb08DUCglBejywgADU770H+d7pzfzEevv9eCYc6fif4tFdCQ3ogQIAAAQIECBAgQIAAAQIECBAgQIAAAQJNCghBNalvbwIECBAgQIAAAQIECBAgQIAAAQIECBAoRiCltDIMQ+UJUe2mG8uhit7L/mBC1NNPzptux/5fIyAINd+vhwDU9N//g3u3Yrt9N7Y+bMXy7SK+Pt2NiF5VVd3p13UCAgQIECBAgAABAgQIECBAgAABAgQIECBQn0ARv8Wv7zgqESBAgAABAgQIECBAgAABAgQIECBAgACBmwuklB5ERGf4s3zzijercHhyETv7p4NQ1MHJxc2KeXosAoJQY2EtvqgAVPFX9JUNrrSq6GwsxnZ7MVaXFko4yOE7U58OSmhIDwQIECBAgAABAgQIECBAgAABAgQIECBAoDQBIajSbkQ/BAgQIECAAAECBAgQIECAAAECBAgQIFCUQEppaxiG2iyhsd1X/S8mRJXQjx7+XUAQar7eBgGo6bzvPO0p/7u6ud4q5QBPcvipqqqnpTSkDwIECBAgQIAAAQIECBAgQIAAAQIECBAgUKqAEFSpN6MvAgQIECBAgAABAgQIECBAgAABAgQIEChKIKW0FhE5ELUdEatNN5cDGN3np9F9cRZ7r9823Y79hwKCUPPxKghATdc9ry0tDCY+5QBUIVOf9iNiJyJ6VVUdTZembgkQIECAAAECBAgQIECAAAECBAgQIECAQHMCQlDN2duZAAECBAgQIECAAAEC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gAABAgQIECBAgAABAgQIECBAgAABAgRmT0AIavbu1IkIECBAgAABAgQIECBAgAABAgQIECBAgEBRAimltWEYKk+IWm26uePzFN3neTrUWey9ftt0O7XsP69BqHkLQD364PZg6tPjjTu1vDc1FHkynPjUq6GWEgQIECBAgAABAgQIECBAgAABAgQIECBAgACBrxUQgvKCECBAgAABAgQIECBAgAABAgQIECBAgAABAhMTSCk9iojPJ0QtT2zjr9ho//Xb2Nl/E71X/Tjqp6bbudH+a0sL0fuT5VImA93oLKM8PC8BqHyvnft3BuGn1aWFUWjGvWY/Irr5p6qqo3Fvpj4BAgQIECBAgAABAgQIECBAgAABAgQIECBA4HMBISjvAgECBAgQIECAAAECBAgQIECAAAECBAgQIDBxgZTSynA6VA5EPZx4A1+yYQ7V5DBU72W/hHau1cNKq4qnW78980GoeQhA5dBT5/5iPHz/vWu9CzU/dJwnPkXETlVVezXXVo4AAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMJKAENRITBYRIECAAAECBAgQIECAAAECBAgQIECAAAEC4xJIKa1FxPYwFLU6rn1GrXt4chHdF2fRfX4WBycXoz5WzLpZD0LNcgDqwb1bsd2+G1sftmL5dhFf4z0bTnzKk598CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQKNChTx7UmjAjYnQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEihFIKW0Nw1CPS2jq2aefRff56WBC1FE/ldDSSD3MahBqFgNQ+a46G4uRJz+1790a6X7HvOgwB5+G4aeDMe+lPAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgZAEhqJGpLCRAgAABAgQIECBAgAABAgQIECBAgAABAgQmJZBSWhmGofKEqPak9v2qfY7PU/Re9gcTop5+ct50OyPtP2tBqFkLQOVpT1vrrXi8cWek+5zAoicR0auqqjeBvWxBgAABAgQIECBAgAABAgQIECBAgAABAgQIELiygBDUlck8QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECExSIKX0ICI6w5/lSe79ZXsdnlzEzv7pIBR1cHLRdDtfu/+sBKFmJQC1trQQ2+3FyAGo1aWFEt6d/YjYGYafjkpoSA8ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAga8SEILybhAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJTI5BS2hqGoTZLaHr3Vf+LCVEl9PNlPUx7EGraA1DZP0986txfjIfvv1fCa3IcEd38U1XVXgkN6YEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMIqAENQoStYQIECAAAECBAgQIECAAAECBAgQIECAAAECRQmklNYiIgeitiNitenmjs9TdJ+fRvfFWey9ftt0O/9p/2kNQk1zAOrBvVux3b47mPq0fLuIr+R2hxOfcgDKhwABAgQIECBAgAABAgQIECBAgAABAgQIECAwdQJFfOMydWoaJkCAAAECBAgQIECAAAECBAgQIECAAAECBIoRSCk9GIahcihquenG9l+/HYShui9O46ifmm7ni/2nLQg1jQGobNzZWIzt9mKsLi2UcPeH70x9OiihIT0QIECAAAECBAgQIECAAAECBAgQIECAAAECBK4rIAR1XTnPESBAgAABAgQIECBAgAABAgQIECBAgAABAsUJpJQ6EZF/HpbQ3O6r/iAQ1XvZL6GdmJYg1LQFoPK0p87Gndhcb5Vwz8d54lMOP1VV9bSEhvRAgAABAgQIECBAgAABAgQIECBAgAABAgQIEKhDQAiqDkU1CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgaIEUkprwzBUDkStNt3c4cnFIAi1s38aBycXjbZTehBqWgJQa0sLg4lPOQBVyNSn/YjYyQGoqqqOGn3JbE6AAAECBAgQIECAAAECBAgQIECAAAECBAgQGIOAENQYUJUkQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEyhFIKT0aBqIel9DV/uu3sbP/Jnqv+nHUT420VGoQqvQAVHbbWm/FdvtutO/dauTu/sOmeepTN4efqqo6KKEhPRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIExiUgBDUuWXUJECBAgAABAgQIECBAgAABAgQIECBAgACBogRSSisRsRUR2xHRbrq54/M0mA7VfXEWTz85n3g7pQWhSg5APfrgdnQ27gymPi3fLuLrtd0cfqqqqjfxF8eGBAgQIECAAAECBAgQIECAAAECBAgQIECAAIGGBIr4lqahs9uWAAECBAgQIECAAAECBAgQIECAAAECBAgQmFOBlNLaMAyVQ1GrTTMcnlwMwlDd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BAgQIECAwDwLCEHN8+07OwECBAgQIECAAAECBAgQIECAAAECBAgQIFCkQEqpExH552EJDe6+6g8CUb2X/d9o590g1HUCUGtLC4OJTzkAVcjUp/2I2ImIXlVVRyXY64EAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQODXAkJQ3gQCBAgQIECAAAECBAgQIECAAAECBAgQIECAQKECKaW1YRgqB6JWm27z8ORiEITa2T+Ng5OLQTs73/kvsTecGjVKfyutKrbWW9G5vxgP339vlEfGveY4T3zKR6mq6mDcm6lPgAABAgQIECBAgAABAgQIECBAgAABAgQIECBwPQEhqOu5eYoAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMFGBlNKjYSDq8UQ3/orN9l+/jZ39N9F71Y+jfrq0pUcf3I7Oxp3B1Kfl20V8RbWbw09VVfUubd4CAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBxgWK+IapcQUNECBAgAABAgQIECBAgAABAgQIECBAgAABAgSmRCCltBIRWxGxHRHtpts+Pk+D6VDdF2fx9JPz32hnbWlhEHrabi/G6tJC063m/Q/zxKeI6Jn6VMJ16IEAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMLqAENToVlYSIECAAAECBAgQIECAAAECBAgQIECAAAECBIoSSCmtDcNQORS12nRzhycXgzDU3uu3g6lPm+utplvK+x/n0NNw6tPTEhrSAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAwNUFhKCubuYJAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBxAimlHITqRMRmcc0109D+O1Ofjpppwa4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJ1CQhB1SWpDgECBAgQIECAAAECBAgQIECAAAECBAgQIECgAIGU0sowDJUDUe0CWppkC4fDqU87VVUdTHJjexEgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECIxXQAhqvL6qEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQaE0gpPYiI7YjIU6KWG2tk/BvvRkS3qqre+LeyAwECBAgQIECAAAECBAgQIECAAAECBAgQIECAQBMCQlBNqNuTAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBhgZRSngyVw1CbE956XNvlqU87w/DT0bg2UZcAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQKAMASGoMu5BFwQIECBAgAABAgQIECBAgAABAgQIECBAgACBiQiklNaGYag8IWp1IpvWt8lxRORpTztVVe3VV1YlAgQIECBAgAABAgQIECBAgAABAgQIECBAgACB0gWEoEq/If0RIECAAAECBAgQIECAAAECBAgQIECAAAECBMYkkFJ6FBGfT4haHtM2dZR9lic+5QBUVVWmPtUhqgYBAgQIECBAgAABAgQIECBAgAABAgQIECBAYMoEhKCm7MK0S4AAAQIECBAgQIAAAQIECBAgQIAAAQIECBCoWyCltDKcDpUDUQ/rrn/NeofD4FO3qqqDa9bwGAECBAgQIECAAAECBAgQIECAAAECBAgQIECAwIwICEHNyEU6BgECBAgQIECAAAECBAgQIECAAAECBAgQIECgDoGU0lpEbA9DUat11LxijSfDiU+9Kz5nOQECBAgQIECAAAECBAgQIECAAAECBAgQIECAwAwLCEHN8OU6GgECBAgQIECAAAECBAgQIECAAAECBAgQIEDgJgIppa1hGOrxTeqM8Oz+O1OfjkZYbwkBAgQIECBAgAABAgQIECBAgAABAgQIECBAgMCcCQhBzdmFOy4BAgQIECBAgAABAgQIECBAgAABAgQIECBA4KoCKaWVYRgqT4hqX/X5r1h/nCc+RcROVVV7NdVUhgABAgQIECBAgAABAgQIECBAgAABAgQIECBAYEYFhKBm9GIdiwABAgQIECBAgAABAgQIECBAgAABAgQIECAwDoGU0oOI6Ax/lq+xx24OP1VV1b3Gsx4hQIAAAQIECBAgQIAAAQIErHJV9AAAIABJREFUCBAgQIAAAQIECBCYUwEhqDm9eMcmQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECNxUIKW0NQxDbV5S6zAicuipW1XVwU339TwBAgQIECBAgAABAgQIECBAgAABAgQIECBAgMD8CQhBzd+dOzEBAgQIECBAgAABAgQIECBAgAABAgQIECBAoFaBlNJaRORA1HZErL5T/Mkw+PS01g0VI0CAAAECBAgQIECAAAECBAgQIECAAAECBAgQmDsBIai5u3IHJkCAAAECBAgQIECAAAECBAgQIECAAAECBAiMTyCl9CAi8k+vqqqj8e2kMgECBAgQIECAAAECBAgQIECAAAECBAgQIECAwDwJCEHN0207KwECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIEpFBCCmsJL0zIBAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACBeRIQgpqn23ZWAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAlMoIAQ1hZemZQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQLzJCAENU+37awECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEplBACGoKL03LBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBOZJQAhqnm7bWQkQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAhMoYAQ1BRempYJECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIzJOAENQ83bazEiBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEJhCASGoKbw0LRMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBCYJwEhqHm6bWclQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgMIUCQlBTeGlaJkCAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIDBPAkJQ83TbzkqAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIEBgCgWEoKbw0rRMgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAYJ4EhKDm6badlQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgMAUCghBTeGlaZkAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIDAPAkIQc3TbTsrAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAgSkUEIKawkvTMgECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAIF5EhCCmqfbdlYCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECUyggBDWFl6ZlAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAvMkIAQ1T7ftrAQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgSmUEAIagovTcsECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE5klACGqebttZCRAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECPz/7NtBEQAAAAHB/q3luLENWG8ECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHio+qYqAAAgAElEQVQScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4OE4tGMAACAASURBVGgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQeBJwgnpaW1cCBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECQQEnqOBoIhMgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBB4EnCCelpbVwIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQJBASeo4GgiEyBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIEHgScIJ6WltXAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAkEBJ6jgaCITIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBNa+HRQBAAAQEOzfWg5z24D1RoAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAAByqmxcAAAIABJREFUAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgACW/ZIdAAAIlUlEQVQBAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBAScAJqrS2rgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQOBZygDkcTmQABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgAABAgQIECBAgEBJwAmqtLauBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBA4FnKAORxOZAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAQEnACaq0tq4ECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIEDgWcoA5HE5kAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIBASWC9/Dedn3vKBAAAAABJRU5ErkJggg==" style=""/></g></g></svg> diff --git a/dms/test/video.mp4 b/dms/test/video.mp4 new file mode 100644 index 000000000..20733f83b Binary files /dev/null and b/dms/test/video.mp4 differ diff --git a/dms/tests/__init__.py b/dms/tests/__init__.py new file mode 100644 index 000000000..2502c8f40 --- /dev/null +++ b/dms/tests/__init__.py @@ -0,0 +1,7 @@ +from . import test_storage_attachment +from . import test_storage_database +from . import test_directory +from . import test_file_database +from . import test_file +from . import test_benchmark +from . import test_portal diff --git a/dms/tests/common.py b/dms/tests/common.py new file mode 100644 index 000000000..d09a5a8e9 --- /dev/null +++ b/dms/tests/common.py @@ -0,0 +1,227 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2024 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +import base64 +import functools +import logging +import threading +import time +import uuid + +from odoo.tests import Form, new_test_user + +from odoo.addons.base.tests.common import BaseCommon + +_logger = logging.getLogger(__name__) + +# ---------------------------------------------------------- +# Decorators +# ---------------------------------------------------------- + + +def track_function( + max_query_count=None, max_query_time=None, max_time=None, return_tracking=False +): + def decorator(func): + @functools.wraps(func) + def wrapper(*args, **kwargs): + tracking_parameters = [func.__name__] + threading.current_thread().query_time = 0 + threading.current_thread().query_count = 0 + threading.current_thread().perf_t0 = time.time() + result = func(*args, **kwargs) + message = f"{func.__name__}" + if args and hasattr(args[0], "uid"): + message = f" ({args[0].uid})" + if hasattr(threading.current_thread(), "query_count"): + query_count = threading.current_thread().query_count + query_time = threading.current_thread().query_time + perf_t0 = threading.current_thread().perf_t0 + remaining_time = time.time() - perf_t0 - query_time + time_taken = query_time + remaining_time + message += ( + f" - {query_count} Q {query_time:.3f}s" + f"QT {remaining_time:.3f}s OT {time_taken:.3f}s TT" + ) + + tracking_parameters += [ + query_count, + query_time, + remaining_time, + time_taken, + ] + if max_query_count and query_count > max_query_count: + raise AssertionError(f"More than {max_query_count} queries") + if max_query_time and query_time > max_query_time: + raise AssertionError( + f"Queries took longer than {max_query_time:.3f}s" + ) + if max_time and time_taken > max_time: + raise AssertionError("Function took longer than {max_time:.3f}s") + if not return_tracking: + _logger.info(message) + if return_tracking: + return result, tracking_parameters + return result + + return wrapper + + return decorator + + +# ---------------------------------------------------------- +# Test Cases +# ---------------------------------------------------------- + + +class DocumentsBaseCase(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + # models + cls.access_group_model = cls.env["dms.access.group"] + cls.storage_model = cls.env["dms.storage"] + cls.directory_model = cls.env["dms.directory"] + cls.file_model = cls.env["dms.file"] + cls.category_model = cls.env["dms.category"] + cls.tag_model = cls.env["dms.tag"] + cls.attachment_model = cls.env["ir.attachment"] + cls.partner_model = cls.env["res.partner"] + # users + cls.user = new_test_user(cls.env, login="basic-user") + cls.public_user = cls.env.ref("base.public_user") + cls.dms_user = new_test_user( + cls.env, login="dms-user", groups="dms.group_dms_user" + ) + cls.dms_manager_user = new_test_user( + cls.env, login="dms-manager", groups="dms.group_dms_manager" + ) + cls.access_group = cls.access_group_model.create( + { + "name": "Test", + "perm_create": True, + "perm_write": True, + "perm_unlink": True, + "explicit_user_ids": [ + (6, 0, [cls.dms_user.id, cls.dms_manager_user.id]) + ], + } + ) + + @classmethod + def content_base64(cls): + return base64.b64encode(b"\xff data") + + @classmethod + def create_storage(cls, save_type="database"): + return cls.storage_model.create( + {"name": "Test Storage", "save_type": save_type} + ) + + @classmethod + def create_directory(cls, storage=False, directory=False, model_id=False): + record = Form(cls.directory_model) + record.name = uuid.uuid4().hex + record.is_root_directory = True + if model_id and storage.save_type == "attachment": + # set storage_id_save_type to attachment, making model visible + record.storage_id = storage + record.model_id = model_id + if directory: + record.is_root_directory = False + record.parent_id = directory + else: + record.storage_id = storage + if not storage.inherit_access_from_parent_record: + record.group_ids.add(cls.access_group) + return record.save() + + @classmethod + def create_file(cls, directory=False, content=False): + record = Form(cls.file_model) + record.name = uuid.uuid4().hex + record.directory_id = directory + record.content = content or cls.content_base64() + return record.save() + + @classmethod + def create_attachment(cls, name, res_model=False, res_id=False, content=False): + return cls.attachment_model.create( + { + "name": name, + "res_model": res_model, + "res_id": res_id, + "datas": content or cls.content_base64(), + } + ) + + +class StorageAttachmentBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="attachment") + cls.storage.write( + { + "inherit_access_from_parent_record": True, + "include_message_attachments": True, + "model_ids": [(6, 0, [cls.env.ref("base.model_res_partner").id])], + } + ) + cls.partner_model_id = cls.env.ref("base.model_res_partner") + cls.create_directory(storage=cls.storage, model_id=cls.partner_model_id) + cls.partner = cls.partner_model.create({"name": "test partner"}) + cls.other_partner = cls.partner_model.create({"name": "other partner"}) + cls.model_partner = cls.env.ref("base.model_res_partner") + + @classmethod + def _create_attachment(cls, name, partner=None): + """ + Create an attachment for the partner model. + If no partner is provided, the default partner is used. + + :param str name: The name of the attachment. + :param odoo.model.res_partner partner: The partner to attach the document to. + + :return: The created attachment. + :rtype: odoo.model.ir.attachment + """ + if not partner: + partner = cls.partner + return cls.create_attachment( + name=name, + res_model=cls.partner_model._name, + res_id=partner.id, + ) + + @classmethod + def _get_partner_directory(cls, partner=False): + if not partner: + partner = cls.partner + return cls.directory_model.search( + [ + ("storage_id", "=", cls.storage.id), + ("res_model", "=", cls.partner_model._name), + ("res_id", "=", partner.id), + ] + ) + + +class StorageDatabaseBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="database") + cls.directory = cls.create_directory(storage=cls.storage) + cls.file = cls.create_file(directory=cls.directory) + + +class StorageFileBaseCase(DocumentsBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.storage = cls.create_storage(save_type="file") + cls.directory = cls.create_directory(storage=cls.storage) + cls.file = cls.create_file(directory=cls.directory) diff --git a/dms/tests/data/dms.category.csv b/dms/tests/data/dms.category.csv new file mode 100644 index 000000000..eeba34233 --- /dev/null +++ b/dms/tests/data/dms.category.csv @@ -0,0 +1,51 @@ +id,name,parent_id/id +dms.category_001_benchmark,C_001, +dms.category_002_benchmark,C_002,dms.category_001_benchmark +dms.category_003_benchmark,C_003,dms.category_002_benchmark +dms.category_004_benchmark,C_004,dms.category_001_benchmark +dms.category_005_benchmark,C_005,dms.category_002_benchmark +dms.category_006_benchmark,C_006,dms.category_003_benchmark +dms.category_007_benchmark,C_007,dms.category_005_benchmark +dms.category_008_benchmark,C_008,dms.category_002_benchmark +dms.category_009_benchmark,C_009,dms.category_006_benchmark +dms.category_010_benchmark,C_010, +dms.category_011_benchmark,C_011,dms.category_001_benchmark +dms.category_012_benchmark,C_012,dms.category_007_benchmark +dms.category_013_benchmark,C_013,dms.category_009_benchmark +dms.category_014_benchmark,C_014,dms.category_013_benchmark +dms.category_015_benchmark,C_015,dms.category_005_benchmark +dms.category_016_benchmark,C_016, +dms.category_017_benchmark,C_017, +dms.category_018_benchmark,C_018, +dms.category_019_benchmark,C_019,dms.category_002_benchmark +dms.category_020_benchmark,C_020,dms.category_013_benchmark +dms.category_021_benchmark,C_021,dms.category_008_benchmark +dms.category_022_benchmark,C_022, +dms.category_023_benchmark,C_023,dms.category_021_benchmark +dms.category_024_benchmark,C_024, +dms.category_025_benchmark,C_025, +dms.category_026_benchmark,C_026,dms.category_016_benchmark +dms.category_027_benchmark,C_027,dms.category_015_benchmark +dms.category_028_benchmark,C_028, +dms.category_029_benchmark,C_029,dms.category_010_benchmark +dms.category_030_benchmark,C_030,dms.category_021_benchmark +dms.category_031_benchmark,C_031,dms.category_003_benchmark +dms.category_032_benchmark,C_032,dms.category_017_benchmark +dms.category_033_benchmark,C_033,dms.category_030_benchmark +dms.category_034_benchmark,C_034, +dms.category_035_benchmark,C_035, +dms.category_036_benchmark,C_036, +dms.category_037_benchmark,C_037,dms.category_011_benchmark +dms.category_038_benchmark,C_038,dms.category_010_benchmark +dms.category_039_benchmark,C_039,dms.category_013_benchmark +dms.category_040_benchmark,C_040, +dms.category_041_benchmark,C_041,dms.category_034_benchmark +dms.category_042_benchmark,C_042,dms.category_023_benchmark +dms.category_043_benchmark,C_043,dms.category_015_benchmark +dms.category_044_benchmark,C_044,dms.category_041_benchmark +dms.category_045_benchmark,C_045,dms.category_039_benchmark +dms.category_046_benchmark,C_046,dms.category_021_benchmark +dms.category_047_benchmark,C_047, +dms.category_048_benchmark,C_048, +dms.category_049_benchmark,C_049,dms.category_042_benchmark +dms.category_050_benchmark,C_050,dms.category_034_benchmark diff --git a/dms/tests/data/dms.directory.csv b/dms/tests/data/dms.directory.csv new file mode 100644 index 000000000..abf954119 --- /dev/null +++ b/dms/tests/data/dms.directory.csv @@ -0,0 +1,501 @@ +id,name,parent_id/id,storage_id/id,is_root_directory,category_id/id,tag_ids/id +dms.directory_001_benchmark,D_0001,,dms.storage_001_benchmark,TRUE,dms.category_041_benchmark,dms.tag_042_benchmark +dms.directory_002_benchmark,D_0002,,dms.storage_002_benchmark,TRUE,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_003_benchmark,D_0003,,dms.storage_001_benchmark,TRUE,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_004_benchmark,D_0004,,dms.storage_002_benchmark,TRUE,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_005_benchmark,D_0005,,dms.storage_001_benchmark,TRUE,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_006_benchmark,D_0006,,dms.storage_002_benchmark,TRUE,,dms.tag_127_benchmark +dms.directory_007_benchmark,D_0007,,dms.storage_001_benchmark,TRUE,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_008_benchmark,D_0008,,dms.storage_002_benchmark,TRUE,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_009_benchmark,D_0009,dms.directory_008_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_010_benchmark,D_0010,dms.directory_003_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_011_benchmark,D_0011,dms.directory_007_benchmark,,,,dms.tag_130_benchmark +dms.directory_012_benchmark,D_0012,dms.directory_009_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_013_benchmark,D_0013,dms.directory_010_benchmark,,,dms.category_021_benchmark,dms.tag_136_benchmark +dms.directory_014_benchmark,D_0014,dms.directory_013_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_015_benchmark,D_0015,dms.directory_008_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_016_benchmark,D_0016,dms.directory_010_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_017_benchmark,D_0017,dms.directory_010_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_018_benchmark,D_0018,dms.directory_010_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_019_benchmark,D_0019,dms.directory_011_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_020_benchmark,D_0020,dms.directory_010_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_021_benchmark,D_0021,dms.directory_003_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_022_benchmark,D_0022,dms.directory_009_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_023_benchmark,D_0023,dms.directory_016_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_024_benchmark,D_0024,dms.directory_016_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_025_benchmark,D_0025,dms.directory_014_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_026_benchmark,D_0026,dms.directory_014_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_027_benchmark,D_0027,dms.directory_008_benchmark,,,,dms.tag_127_benchmark +dms.directory_028_benchmark,D_0028,dms.directory_018_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_029_benchmark,D_0029,dms.directory_019_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_030_benchmark,D_0030,dms.directory_001_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_031_benchmark,D_0031,dms.directory_008_benchmark,,,dms.category_040_benchmark,dms.tag_072_benchmark +dms.directory_032_benchmark,D_0032,dms.directory_023_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_033_benchmark,D_0033,dms.directory_004_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_034_benchmark,D_0034,dms.directory_031_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_035_benchmark,D_0035,dms.directory_014_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_036_benchmark,D_0036,dms.directory_016_benchmark,,,,dms.tag_070_benchmark +dms.directory_037_benchmark,D_0037,dms.directory_029_benchmark,,,dms.category_018_benchmark,dms.tag_133_benchmark +dms.directory_038_benchmark,D_0038,dms.directory_036_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_039_benchmark,D_0039,dms.directory_030_benchmark,,,dms.category_049_benchmark,dms.tag_035_benchmark +dms.directory_040_benchmark,D_0040,dms.directory_008_benchmark,,,,dms.tag_123_benchmark +dms.directory_041_benchmark,D_0041,dms.directory_004_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_042_benchmark,D_0042,dms.directory_012_benchmark,,,, +dms.directory_043_benchmark,D_0043,dms.directory_001_benchmark,,,,dms.tag_108_benchmark +dms.directory_044_benchmark,D_0044,dms.directory_012_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_045_benchmark,D_0045,dms.directory_013_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_046_benchmark,D_0046,dms.directory_043_benchmark,,,,dms.tag_013_benchmark +dms.directory_047_benchmark,D_0047,dms.directory_003_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_048_benchmark,D_0048,dms.directory_018_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_049_benchmark,D_0049,dms.directory_023_benchmark,,,, +dms.directory_050_benchmark,D_0050,dms.directory_033_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_051_benchmark,D_0051,dms.directory_004_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_052_benchmark,D_0052,dms.directory_034_benchmark,,,,dms.tag_046_benchmark +dms.directory_053_benchmark,D_0053,dms.directory_037_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_054_benchmark,D_0054,dms.directory_049_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_055_benchmark,D_0055,dms.directory_028_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_056_benchmark,D_0056,dms.directory_032_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_057_benchmark,D_0057,dms.directory_025_benchmark,,,,dms.tag_127_benchmark +dms.directory_058_benchmark,D_0058,dms.directory_054_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_059_benchmark,D_0059,dms.directory_019_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_060_benchmark,D_0060,dms.directory_059_benchmark,,,,dms.tag_037_benchmark +dms.directory_061_benchmark,D_0061,dms.directory_025_benchmark,,,,dms.tag_046_benchmark +dms.directory_062_benchmark,D_0062,dms.directory_052_benchmark,,,dms.category_046_benchmark,dms.tag_022_benchmark +dms.directory_063_benchmark,D_0063,dms.directory_017_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_064_benchmark,D_0064,dms.directory_057_benchmark,,,,dms.tag_123_benchmark +dms.directory_065_benchmark,D_0065,dms.directory_002_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_066_benchmark,D_0066,dms.directory_008_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_067_benchmark,D_0067,dms.directory_026_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_068_benchmark,D_0068,dms.directory_016_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_069_benchmark,D_0069,dms.directory_061_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_070_benchmark,D_0070,dms.directory_018_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_071_benchmark,D_0071,dms.directory_036_benchmark,,,,dms.tag_091_benchmark +dms.directory_072_benchmark,D_0072,dms.directory_046_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_073_benchmark,D_0073,dms.directory_013_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_074_benchmark,D_0074,dms.directory_038_benchmark,,,,dms.tag_044_benchmark +dms.directory_075_benchmark,D_0075,dms.directory_023_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_076_benchmark,D_0076,dms.directory_037_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_077_benchmark,D_0077,dms.directory_058_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_078_benchmark,D_0078,dms.directory_034_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_079_benchmark,D_0079,dms.directory_034_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_080_benchmark,D_0080,dms.directory_037_benchmark,,,dms.category_006_benchmark,dms.tag_041_benchmark +dms.directory_081_benchmark,D_0081,dms.directory_050_benchmark,,,,dms.tag_091_benchmark +dms.directory_082_benchmark,D_0082,dms.directory_042_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_083_benchmark,D_0083,dms.directory_038_benchmark,,,,dms.tag_134_benchmark +dms.directory_084_benchmark,D_0084,dms.directory_067_benchmark,,,,dms.tag_119_benchmark +dms.directory_085_benchmark,D_0085,dms.directory_041_benchmark,,,dms.category_050_benchmark,dms.tag_050_benchmark +dms.directory_086_benchmark,D_0086,dms.directory_001_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_087_benchmark,D_0087,dms.directory_083_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_088_benchmark,D_0088,dms.directory_036_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_089_benchmark,D_0089,dms.directory_044_benchmark,,,,dms.tag_010_benchmark +dms.directory_090_benchmark,D_0090,dms.directory_040_benchmark,,,,dms.tag_119_benchmark +dms.directory_091_benchmark,D_0091,dms.directory_011_benchmark,,,dms.category_003_benchmark,dms.tag_145_benchmark +dms.directory_092_benchmark,D_0092,dms.directory_045_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_093_benchmark,D_0093,dms.directory_007_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_094_benchmark,D_0094,dms.directory_003_benchmark,,,dms.category_041_benchmark,dms.tag_042_benchmark +dms.directory_095_benchmark,D_0095,dms.directory_085_benchmark,,,,dms.tag_004_benchmark +dms.directory_096_benchmark,D_0096,dms.directory_023_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_097_benchmark,D_0097,dms.directory_007_benchmark,,,, +dms.directory_098_benchmark,D_0098,dms.directory_070_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_099_benchmark,D_0099,dms.directory_053_benchmark,,,,dms.tag_127_benchmark +dms.directory_100_benchmark,D_0100,dms.directory_092_benchmark,,,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_101_benchmark,D_0101,dms.directory_037_benchmark,,,dms.category_011_benchmark,dms.tag_021_benchmark +dms.directory_102_benchmark,D_0102,dms.directory_063_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_103_benchmark,D_0103,dms.directory_067_benchmark,,,dms.category_044_benchmark,dms.tag_095_benchmark +dms.directory_104_benchmark,D_0104,dms.directory_018_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_105_benchmark,D_0105,dms.directory_056_benchmark,,,,dms.tag_034_benchmark +dms.directory_106_benchmark,D_0106,dms.directory_085_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_107_benchmark,D_0107,dms.directory_053_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_108_benchmark,D_0108,dms.directory_027_benchmark,,,,dms.tag_013_benchmark +dms.directory_109_benchmark,D_0109,dms.directory_045_benchmark,,,dms.category_009_benchmark,dms.tag_025_benchmark +dms.directory_110_benchmark,D_0110,dms.directory_076_benchmark,,,,dms.tag_124_benchmark +dms.directory_111_benchmark,D_0111,dms.directory_091_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_112_benchmark,D_0112,dms.directory_066_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_113_benchmark,D_0113,dms.directory_056_benchmark,,,,dms.tag_104_benchmark +dms.directory_114_benchmark,D_0114,dms.directory_031_benchmark,,,, +dms.directory_115_benchmark,D_0115,dms.directory_078_benchmark,,,,dms.tag_075_benchmark +dms.directory_116_benchmark,D_0116,dms.directory_099_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_117_benchmark,D_0117,dms.directory_043_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_118_benchmark,D_0118,dms.directory_042_benchmark,,,,dms.tag_108_benchmark +dms.directory_119_benchmark,D_0119,dms.directory_055_benchmark,,,dms.category_049_benchmark,dms.tag_007_benchmark +dms.directory_120_benchmark,D_0120,dms.directory_006_benchmark,,,,dms.tag_137_benchmark +dms.directory_121_benchmark,D_0121,dms.directory_020_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_122_benchmark,D_0122,dms.directory_096_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_123_benchmark,D_0123,dms.directory_079_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_124_benchmark,D_0124,dms.directory_050_benchmark,,,,dms.tag_010_benchmark +dms.directory_125_benchmark,D_0125,dms.directory_073_benchmark,,,dms.category_031_benchmark,dms.tag_114_benchmark +dms.directory_126_benchmark,D_0126,dms.directory_112_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_127_benchmark,D_0127,dms.directory_069_benchmark,,,dms.category_015_benchmark,dms.tag_056_benchmark +dms.directory_128_benchmark,D_0128,dms.directory_091_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_129_benchmark,D_0129,dms.directory_037_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_130_benchmark,D_0130,dms.directory_028_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_131_benchmark,D_0131,dms.directory_018_benchmark,,,dms.category_001_benchmark,dms.tag_102_benchmark +dms.directory_132_benchmark,D_0132,dms.directory_128_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_133_benchmark,D_0133,dms.directory_054_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_134_benchmark,D_0134,dms.directory_114_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_135_benchmark,D_0135,dms.directory_062_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_136_benchmark,D_0136,dms.directory_069_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_137_benchmark,D_0137,dms.directory_090_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_138_benchmark,D_0138,dms.directory_065_benchmark,,,dms.category_040_benchmark,dms.tag_043_benchmark +dms.directory_139_benchmark,D_0139,dms.directory_125_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_140_benchmark,D_0140,dms.directory_067_benchmark,,,,dms.tag_108_benchmark +dms.directory_141_benchmark,D_0141,dms.directory_040_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_142_benchmark,D_0142,dms.directory_080_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_143_benchmark,D_0143,dms.directory_083_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_144_benchmark,D_0144,dms.directory_095_benchmark,,,,dms.tag_086_benchmark +dms.directory_145_benchmark,D_0145,dms.directory_003_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_146_benchmark,D_0146,dms.directory_126_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_147_benchmark,D_0147,dms.directory_099_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_148_benchmark,D_0148,dms.directory_086_benchmark,,,, +dms.directory_149_benchmark,D_0149,dms.directory_053_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_150_benchmark,D_0150,dms.directory_031_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_151_benchmark,D_0151,dms.directory_134_benchmark,,,dms.category_008_benchmark,dms.tag_077_benchmark +dms.directory_152_benchmark,D_0152,dms.directory_053_benchmark,,,dms.category_034_benchmark,dms.tag_109_benchmark +dms.directory_153_benchmark,D_0153,dms.directory_026_benchmark,,,dms.category_023_benchmark,dms.tag_038_benchmark +dms.directory_154_benchmark,D_0154,dms.directory_118_benchmark,,,,dms.tag_034_benchmark +dms.directory_155_benchmark,D_0155,dms.directory_058_benchmark,,,dms.category_027_benchmark,dms.tag_048_benchmark +dms.directory_156_benchmark,D_0156,dms.directory_077_benchmark,,,dms.category_009_benchmark,dms.tag_025_benchmark +dms.directory_157_benchmark,D_0157,dms.directory_089_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_158_benchmark,D_0158,dms.directory_033_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_159_benchmark,D_0159,dms.directory_010_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_160_benchmark,D_0160,dms.directory_006_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_161_benchmark,D_0161,dms.directory_018_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_162_benchmark,D_0162,dms.directory_026_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_163_benchmark,D_0163,dms.directory_118_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_164_benchmark,D_0164,dms.directory_130_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_165_benchmark,D_0165,dms.directory_104_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_166_benchmark,D_0166,dms.directory_083_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_167_benchmark,D_0167,dms.directory_095_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_168_benchmark,D_0168,dms.directory_021_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_169_benchmark,D_0169,dms.directory_087_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_170_benchmark,D_0170,dms.directory_147_benchmark,,,,dms.tag_006_benchmark +dms.directory_171_benchmark,D_0171,dms.directory_023_benchmark,,,dms.category_020_benchmark,dms.tag_141_benchmark +dms.directory_172_benchmark,D_0172,dms.directory_002_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_173_benchmark,D_0173,dms.directory_041_benchmark,,,dms.category_033_benchmark,dms.tag_113_benchmark +dms.directory_174_benchmark,D_0174,dms.directory_069_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_175_benchmark,D_0175,dms.directory_091_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_176_benchmark,D_0176,dms.directory_056_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_177_benchmark,D_0177,dms.directory_035_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_178_benchmark,D_0178,dms.directory_108_benchmark,,,dms.category_019_benchmark,dms.tag_055_benchmark +dms.directory_179_benchmark,D_0179,dms.directory_121_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_180_benchmark,D_0180,dms.directory_178_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_181_benchmark,D_0181,dms.directory_085_benchmark,,,,dms.tag_132_benchmark +dms.directory_182_benchmark,D_0182,dms.directory_103_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_183_benchmark,D_0183,dms.directory_086_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_184_benchmark,D_0184,dms.directory_029_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_185_benchmark,D_0185,dms.directory_170_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_186_benchmark,D_0186,dms.directory_100_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_187_benchmark,D_0187,dms.directory_034_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_188_benchmark,D_0188,dms.directory_072_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_189_benchmark,D_0189,dms.directory_022_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_190_benchmark,D_0190,dms.directory_076_benchmark,,,,dms.tag_013_benchmark +dms.directory_191_benchmark,D_0191,dms.directory_146_benchmark,,,,dms.tag_012_benchmark +dms.directory_192_benchmark,D_0192,dms.directory_023_benchmark,,,dms.category_025_benchmark,dms.tag_074_benchmark +dms.directory_193_benchmark,D_0193,dms.directory_183_benchmark,,,,dms.tag_032_benchmark +dms.directory_194_benchmark,D_0194,dms.directory_047_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_195_benchmark,D_0195,dms.directory_094_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_196_benchmark,D_0196,dms.directory_159_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_197_benchmark,D_0197,dms.directory_140_benchmark,,,dms.category_019_benchmark,dms.tag_105_benchmark +dms.directory_198_benchmark,D_0198,dms.directory_169_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_199_benchmark,D_0199,dms.directory_099_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_200_benchmark,D_0200,dms.directory_123_benchmark,,,dms.category_031_benchmark,dms.tag_116_benchmark +dms.directory_201_benchmark,D_0201,dms.directory_090_benchmark,,,dms.category_049_benchmark,dms.tag_093_benchmark +dms.directory_202_benchmark,D_0202,dms.directory_095_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_203_benchmark,D_0203,dms.directory_107_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_204_benchmark,D_0204,dms.directory_105_benchmark,,,,dms.tag_046_benchmark +dms.directory_205_benchmark,D_0205,dms.directory_092_benchmark,,,, +dms.directory_206_benchmark,D_0206,dms.directory_162_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_207_benchmark,D_0207,dms.directory_027_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_208_benchmark,D_0208,dms.directory_011_benchmark,,,,dms.tag_119_benchmark +dms.directory_209_benchmark,D_0209,dms.directory_135_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_210_benchmark,D_0210,dms.directory_160_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_211_benchmark,D_0211,dms.directory_015_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_212_benchmark,D_0212,dms.directory_087_benchmark,,,dms.category_049_benchmark,dms.tag_040_benchmark +dms.directory_213_benchmark,D_0213,dms.directory_015_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_214_benchmark,D_0214,dms.directory_100_benchmark,,,,dms.tag_065_benchmark +dms.directory_215_benchmark,D_0215,dms.directory_075_benchmark,,,,dms.tag_065_benchmark +dms.directory_216_benchmark,D_0216,dms.directory_040_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_217_benchmark,D_0217,dms.directory_056_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_218_benchmark,D_0218,dms.directory_157_benchmark,,,,dms.tag_013_benchmark +dms.directory_219_benchmark,D_0219,dms.directory_154_benchmark,,,dms.category_034_benchmark,dms.tag_047_benchmark +dms.directory_220_benchmark,D_0220,dms.directory_207_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_221_benchmark,D_0221,dms.directory_041_benchmark,,,, +dms.directory_222_benchmark,D_0222,dms.directory_002_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_223_benchmark,D_0223,dms.directory_176_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_224_benchmark,D_0224,dms.directory_223_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_225_benchmark,D_0225,dms.directory_202_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_226_benchmark,D_0226,dms.directory_128_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_227_benchmark,D_0227,dms.directory_044_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_228_benchmark,D_0228,dms.directory_105_benchmark,,,dms.category_012_benchmark,dms.tag_098_benchmark +dms.directory_229_benchmark,D_0229,dms.directory_202_benchmark,,,dms.category_006_benchmark,dms.tag_041_benchmark +dms.directory_230_benchmark,D_0230,dms.directory_104_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_231_benchmark,D_0231,dms.directory_137_benchmark,,,,dms.tag_065_benchmark +dms.directory_232_benchmark,D_0232,dms.directory_179_benchmark,,,,dms.tag_119_benchmark +dms.directory_233_benchmark,D_0233,dms.directory_059_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_234_benchmark,D_0234,dms.directory_147_benchmark,,,,dms.tag_123_benchmark +dms.directory_235_benchmark,D_0235,dms.directory_114_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_236_benchmark,D_0236,dms.directory_033_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_237_benchmark,D_0237,dms.directory_037_benchmark,,,,dms.tag_006_benchmark +dms.directory_238_benchmark,D_0238,dms.directory_083_benchmark,,,dms.category_021_benchmark,dms.tag_140_benchmark +dms.directory_239_benchmark,D_0239,dms.directory_151_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_240_benchmark,D_0240,dms.directory_156_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_241_benchmark,D_0241,dms.directory_034_benchmark,,,, +dms.directory_242_benchmark,D_0242,dms.directory_177_benchmark,,,,dms.tag_032_benchmark +dms.directory_243_benchmark,D_0243,dms.directory_192_benchmark,,,,dms.tag_127_benchmark +dms.directory_244_benchmark,D_0244,dms.directory_022_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_245_benchmark,D_0245,dms.directory_031_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_246_benchmark,D_0246,dms.directory_051_benchmark,,,, +dms.directory_247_benchmark,D_0247,dms.directory_007_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_248_benchmark,D_0248,dms.directory_135_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_249_benchmark,D_0249,dms.directory_111_benchmark,,,,dms.tag_015_benchmark +dms.directory_250_benchmark,D_0250,dms.directory_016_benchmark,,,,dms.tag_123_benchmark +dms.directory_251_benchmark,D_0251,dms.directory_243_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_252_benchmark,D_0252,dms.directory_102_benchmark,,,,dms.tag_009_benchmark +dms.directory_253_benchmark,D_0253,dms.directory_063_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_254_benchmark,D_0254,dms.directory_185_benchmark,,,dms.category_025_benchmark,dms.tag_028_benchmark +dms.directory_255_benchmark,D_0255,dms.directory_024_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_256_benchmark,D_0256,dms.directory_054_benchmark,,,,dms.tag_016_benchmark +dms.directory_257_benchmark,D_0257,dms.directory_122_benchmark,,,,dms.tag_016_benchmark +dms.directory_258_benchmark,D_0258,dms.directory_115_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_259_benchmark,D_0259,dms.directory_136_benchmark,,,,dms.tag_063_benchmark +dms.directory_260_benchmark,D_0260,dms.directory_106_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_261_benchmark,D_0261,dms.directory_247_benchmark,,,, +dms.directory_262_benchmark,D_0262,dms.directory_077_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_263_benchmark,D_0263,dms.directory_017_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_264_benchmark,D_0264,dms.directory_061_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_265_benchmark,D_0265,dms.directory_138_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_266_benchmark,D_0266,dms.directory_252_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_267_benchmark,D_0267,dms.directory_159_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_268_benchmark,D_0268,dms.directory_184_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_269_benchmark,D_0269,dms.directory_253_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_270_benchmark,D_0270,dms.directory_095_benchmark,,,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_271_benchmark,D_0271,dms.directory_078_benchmark,,,dms.category_005_benchmark,dms.tag_014_benchmark +dms.directory_272_benchmark,D_0272,dms.directory_022_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_273_benchmark,D_0273,dms.directory_076_benchmark,,,,dms.tag_013_benchmark +dms.directory_274_benchmark,D_0274,dms.directory_194_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_275_benchmark,D_0275,dms.directory_251_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_276_benchmark,D_0276,dms.directory_246_benchmark,,,dms.category_019_benchmark,dms.tag_081_benchmark +dms.directory_277_benchmark,D_0277,dms.directory_073_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_278_benchmark,D_0278,dms.directory_151_benchmark,,,,dms.tag_009_benchmark +dms.directory_279_benchmark,D_0279,dms.directory_143_benchmark,,,,dms.tag_010_benchmark +dms.directory_280_benchmark,D_0280,dms.directory_270_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_281_benchmark,D_0281,dms.directory_146_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_282_benchmark,D_0282,dms.directory_258_benchmark,,,,dms.tag_046_benchmark +dms.directory_283_benchmark,D_0283,dms.directory_098_benchmark,,,,dms.tag_013_benchmark +dms.directory_284_benchmark,D_0284,dms.directory_041_benchmark,,,,dms.tag_006_benchmark +dms.directory_285_benchmark,D_0285,dms.directory_239_benchmark,,,,dms.tag_037_benchmark +dms.directory_286_benchmark,D_0286,dms.directory_229_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_287_benchmark,D_0287,dms.directory_186_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_288_benchmark,D_0288,dms.directory_149_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_289_benchmark,D_0289,dms.directory_187_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_290_benchmark,D_0290,dms.directory_138_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_291_benchmark,D_0291,dms.directory_104_benchmark,,,,dms.tag_013_benchmark +dms.directory_292_benchmark,D_0292,dms.directory_188_benchmark,,,,dms.tag_094_benchmark +dms.directory_293_benchmark,D_0293,dms.directory_030_benchmark,,,dms.category_018_benchmark,dms.tag_083_benchmark +dms.directory_294_benchmark,D_0294,dms.directory_002_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_295_benchmark,D_0295,dms.directory_042_benchmark,,,,dms.tag_037_benchmark +dms.directory_296_benchmark,D_0296,dms.directory_281_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_297_benchmark,D_0297,dms.directory_152_benchmark,,,,dms.tag_012_benchmark +dms.directory_298_benchmark,D_0298,dms.directory_219_benchmark,,,,dms.tag_096_benchmark +dms.directory_299_benchmark,D_0299,dms.directory_133_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_300_benchmark,D_0300,dms.directory_024_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_301_benchmark,D_0301,dms.directory_006_benchmark,,,dms.category_020_benchmark,dms.tag_129_benchmark +dms.directory_302_benchmark,D_0302,dms.directory_211_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_303_benchmark,D_0303,dms.directory_210_benchmark,,,,dms.tag_044_benchmark +dms.directory_304_benchmark,D_0304,dms.directory_047_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_305_benchmark,D_0305,dms.directory_041_benchmark,,,dms.category_040_benchmark,dms.tag_054_benchmark +dms.directory_306_benchmark,D_0306,dms.directory_290_benchmark,,,,dms.tag_108_benchmark +dms.directory_307_benchmark,D_0307,dms.directory_278_benchmark,,,, +dms.directory_308_benchmark,D_0308,dms.directory_303_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_309_benchmark,D_0309,dms.directory_133_benchmark,,,dms.category_035_benchmark,dms.tag_101_benchmark +dms.directory_310_benchmark,D_0310,dms.directory_231_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_311_benchmark,D_0311,dms.directory_223_benchmark,,,dms.category_003_benchmark,dms.tag_106_benchmark +dms.directory_312_benchmark,D_0312,dms.directory_034_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_313_benchmark,D_0313,dms.directory_180_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_314_benchmark,D_0314,dms.directory_284_benchmark,,,,dms.tag_104_benchmark +dms.directory_315_benchmark,D_0315,dms.directory_024_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_316_benchmark,D_0316,dms.directory_297_benchmark,,,,dms.tag_044_benchmark +dms.directory_317_benchmark,D_0317,dms.directory_290_benchmark,,,dms.category_050_benchmark,dms.tag_029_benchmark +dms.directory_318_benchmark,D_0318,dms.directory_081_benchmark,,,dms.category_025_benchmark,dms.tag_097_benchmark +dms.directory_319_benchmark,D_0319,dms.directory_261_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_320_benchmark,D_0320,dms.directory_183_benchmark,,,,dms.tag_086_benchmark +dms.directory_321_benchmark,D_0321,dms.directory_311_benchmark,,,,dms.tag_015_benchmark +dms.directory_322_benchmark,D_0322,dms.directory_009_benchmark,,,,dms.tag_015_benchmark +dms.directory_323_benchmark,D_0323,dms.directory_226_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_324_benchmark,D_0324,dms.directory_013_benchmark,,,,dms.tag_037_benchmark +dms.directory_325_benchmark,D_0325,dms.directory_123_benchmark,,,dms.category_050_benchmark,dms.tag_050_benchmark +dms.directory_326_benchmark,D_0326,dms.directory_201_benchmark,,,,dms.tag_016_benchmark +dms.directory_327_benchmark,D_0327,dms.directory_029_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_328_benchmark,D_0328,dms.directory_231_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_329_benchmark,D_0329,dms.directory_207_benchmark,,,,dms.tag_016_benchmark +dms.directory_330_benchmark,D_0330,dms.directory_078_benchmark,,,dms.category_020_benchmark,dms.tag_141_benchmark +dms.directory_331_benchmark,D_0331,dms.directory_179_benchmark,,,,dms.tag_096_benchmark +dms.directory_332_benchmark,D_0332,dms.directory_019_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_333_benchmark,D_0333,dms.directory_246_benchmark,,,dms.category_034_benchmark,dms.tag_033_benchmark +dms.directory_334_benchmark,D_0334,dms.directory_194_benchmark,,,dms.category_016_benchmark,dms.tag_147_benchmark +dms.directory_335_benchmark,D_0335,dms.directory_190_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_336_benchmark,D_0336,dms.directory_244_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_337_benchmark,D_0337,dms.directory_148_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_338_benchmark,D_0338,dms.directory_197_benchmark,,,,dms.tag_090_benchmark +dms.directory_339_benchmark,D_0339,dms.directory_235_benchmark,,,,dms.tag_006_benchmark +dms.directory_340_benchmark,D_0340,dms.directory_219_benchmark,,,,dms.tag_060_benchmark +dms.directory_341_benchmark,D_0341,dms.directory_071_benchmark,,,dms.category_015_benchmark,dms.tag_089_benchmark +dms.directory_342_benchmark,D_0342,dms.directory_211_benchmark,,,dms.category_017_benchmark,dms.tag_017_benchmark +dms.directory_343_benchmark,D_0343,dms.directory_029_benchmark,,,,dms.tag_037_benchmark +dms.directory_344_benchmark,D_0344,dms.directory_271_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_345_benchmark,D_0345,dms.directory_098_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_346_benchmark,D_0346,dms.directory_065_benchmark,,,dms.category_007_benchmark,dms.tag_067_benchmark +dms.directory_347_benchmark,D_0347,dms.directory_263_benchmark,,,,dms.tag_044_benchmark +dms.directory_348_benchmark,D_0348,dms.directory_294_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_349_benchmark,D_0349,dms.directory_233_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_350_benchmark,D_0350,dms.directory_095_benchmark,,,dms.category_049_benchmark,dms.tag_040_benchmark +dms.directory_351_benchmark,D_0351,dms.directory_342_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_352_benchmark,D_0352,dms.directory_331_benchmark,,,,dms.tag_094_benchmark +dms.directory_353_benchmark,D_0353,dms.directory_067_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_354_benchmark,D_0354,dms.directory_269_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_355_benchmark,D_0355,dms.directory_045_benchmark,,,,dms.tag_104_benchmark +dms.directory_356_benchmark,D_0356,dms.directory_013_benchmark,,,dms.category_024_benchmark,dms.tag_049_benchmark +dms.directory_357_benchmark,D_0357,dms.directory_347_benchmark,,,dms.category_050_benchmark,dms.tag_110_benchmark +dms.directory_358_benchmark,D_0358,dms.directory_099_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_359_benchmark,D_0359,dms.directory_214_benchmark,,,,dms.tag_132_benchmark +dms.directory_360_benchmark,D_0360,dms.directory_043_benchmark,,,, +dms.directory_361_benchmark,D_0361,dms.directory_054_benchmark,,,,dms.tag_044_benchmark +dms.directory_362_benchmark,D_0362,dms.directory_320_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_363_benchmark,D_0363,dms.directory_020_benchmark,,,,dms.tag_134_benchmark +dms.directory_364_benchmark,D_0364,dms.directory_328_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_365_benchmark,D_0365,dms.directory_075_benchmark,,,,dms.tag_015_benchmark +dms.directory_366_benchmark,D_0366,dms.directory_147_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_367_benchmark,D_0367,dms.directory_318_benchmark,,,dms.category_001_benchmark,dms.tag_099_benchmark +dms.directory_368_benchmark,D_0368,dms.directory_143_benchmark,,,,dms.tag_108_benchmark +dms.directory_369_benchmark,D_0369,dms.directory_220_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_370_benchmark,D_0370,dms.directory_194_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_371_benchmark,D_0371,dms.directory_024_benchmark,,,dms.category_022_benchmark,dms.tag_073_benchmark +dms.directory_372_benchmark,D_0372,dms.directory_023_benchmark,,,dms.category_004_benchmark,dms.tag_135_benchmark +dms.directory_373_benchmark,D_0373,dms.directory_149_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_374_benchmark,D_0374,dms.directory_097_benchmark,,,dms.category_007_benchmark,dms.tag_118_benchmark +dms.directory_375_benchmark,D_0375,dms.directory_356_benchmark,,,,dms.tag_016_benchmark +dms.directory_376_benchmark,D_0376,dms.directory_106_benchmark,,,, +dms.directory_377_benchmark,D_0377,dms.directory_145_benchmark,,,dms.category_044_benchmark,dms.tag_095_benchmark +dms.directory_378_benchmark,D_0378,dms.directory_135_benchmark,,,dms.category_038_benchmark,dms.tag_092_benchmark +dms.directory_379_benchmark,D_0379,dms.directory_148_benchmark,,,dms.category_034_benchmark,dms.tag_109_benchmark +dms.directory_380_benchmark,D_0380,dms.directory_108_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_381_benchmark,D_0381,dms.directory_064_benchmark,,,dms.category_003_benchmark,dms.tag_076_benchmark +dms.directory_382_benchmark,D_0382,dms.directory_282_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_383_benchmark,D_0383,dms.directory_172_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_384_benchmark,D_0384,dms.directory_190_benchmark,,,dms.category_039_benchmark,dms.tag_003_benchmark +dms.directory_385_benchmark,D_0385,dms.directory_216_benchmark,,,dms.category_050_benchmark,dms.tag_029_benchmark +dms.directory_386_benchmark,D_0386,dms.directory_181_benchmark,,,dms.category_003_benchmark,dms.tag_145_benchmark +dms.directory_387_benchmark,D_0387,dms.directory_193_benchmark,,,dms.category_015_benchmark,dms.tag_002_benchmark +dms.directory_388_benchmark,D_0388,dms.directory_027_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_389_benchmark,D_0389,dms.directory_164_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_390_benchmark,D_0390,dms.directory_385_benchmark,,,dms.category_013_benchmark,dms.tag_031_benchmark +dms.directory_391_benchmark,D_0391,dms.directory_283_benchmark,,,,dms.tag_086_benchmark +dms.directory_392_benchmark,D_0392,dms.directory_213_benchmark,,,dms.category_029_benchmark,dms.tag_005_benchmark +dms.directory_393_benchmark,D_0393,dms.directory_013_benchmark,,,dms.category_046_benchmark,dms.tag_022_benchmark +dms.directory_394_benchmark,D_0394,dms.directory_214_benchmark,,,dms.category_034_benchmark,dms.tag_142_benchmark +dms.directory_395_benchmark,D_0395,dms.directory_352_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_396_benchmark,D_0396,dms.directory_030_benchmark,,,,dms.tag_132_benchmark +dms.directory_397_benchmark,D_0397,dms.directory_335_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_398_benchmark,D_0398,dms.directory_135_benchmark,,,dms.category_014_benchmark,dms.tag_059_benchmark +dms.directory_399_benchmark,D_0399,dms.directory_382_benchmark,,,dms.category_015_benchmark,dms.tag_120_benchmark +dms.directory_400_benchmark,D_0400,dms.directory_108_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_401_benchmark,D_0401,dms.directory_329_benchmark,,,dms.category_005_benchmark,dms.tag_014_benchmark +dms.directory_402_benchmark,D_0402,dms.directory_253_benchmark,,,dms.category_040_benchmark,dms.tag_072_benchmark +dms.directory_403_benchmark,D_0403,dms.directory_001_benchmark,,,dms.category_020_benchmark,dms.tag_129_benchmark +dms.directory_404_benchmark,D_0404,dms.directory_343_benchmark,,,dms.category_001_benchmark,dms.tag_122_benchmark +dms.directory_405_benchmark,D_0405,dms.directory_143_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_406_benchmark,D_0406,dms.directory_308_benchmark,,,dms.category_039_benchmark,dms.tag_128_benchmark +dms.directory_407_benchmark,D_0407,dms.directory_350_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_408_benchmark,D_0408,dms.directory_383_benchmark,,,dms.category_027_benchmark,dms.tag_001_benchmark +dms.directory_409_benchmark,D_0409,dms.directory_069_benchmark,,,,dms.tag_090_benchmark +dms.directory_410_benchmark,D_0410,dms.directory_239_benchmark,,,dms.category_025_benchmark,dms.tag_097_benchmark +dms.directory_411_benchmark,D_0411,dms.directory_208_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_412_benchmark,D_0412,dms.directory_053_benchmark,,,dms.category_014_benchmark,dms.tag_149_benchmark +dms.directory_413_benchmark,D_0413,dms.directory_191_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_414_benchmark,D_0414,dms.directory_151_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_415_benchmark,D_0415,dms.directory_151_benchmark,,,,dms.tag_090_benchmark +dms.directory_416_benchmark,D_0416,dms.directory_169_benchmark,,,dms.category_039_benchmark,dms.tag_146_benchmark +dms.directory_417_benchmark,D_0417,dms.directory_282_benchmark,,,dms.category_023_benchmark,dms.tag_038_benchmark +dms.directory_418_benchmark,D_0418,dms.directory_300_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_419_benchmark,D_0419,dms.directory_239_benchmark,,,dms.category_026_benchmark,dms.tag_027_benchmark +dms.directory_420_benchmark,D_0420,dms.directory_395_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_421_benchmark,D_0421,dms.directory_303_benchmark,,,dms.category_014_benchmark,dms.tag_078_benchmark +dms.directory_422_benchmark,D_0422,dms.directory_415_benchmark,,,dms.category_022_benchmark,dms.tag_061_benchmark +dms.directory_423_benchmark,D_0423,dms.directory_183_benchmark,,,,dms.tag_006_benchmark +dms.directory_424_benchmark,D_0424,dms.directory_253_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_425_benchmark,D_0425,dms.directory_383_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_426_benchmark,D_0426,dms.directory_421_benchmark,,,dms.category_012_benchmark,dms.tag_023_benchmark +dms.directory_427_benchmark,D_0427,dms.directory_036_benchmark,,,dms.category_043_benchmark,dms.tag_079_benchmark +dms.directory_428_benchmark,D_0428,dms.directory_151_benchmark,,,dms.category_016_benchmark,dms.tag_100_benchmark +dms.directory_429_benchmark,D_0429,dms.directory_008_benchmark,,,dms.category_011_benchmark,dms.tag_021_benchmark +dms.directory_430_benchmark,D_0430,dms.directory_201_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_431_benchmark,D_0431,dms.directory_125_benchmark,,,dms.category_011_benchmark,dms.tag_080_benchmark +dms.directory_432_benchmark,D_0432,dms.directory_275_benchmark,,,dms.category_001_benchmark,dms.tag_051_benchmark +dms.directory_433_benchmark,D_0433,dms.directory_290_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_434_benchmark,D_0434,dms.directory_351_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_435_benchmark,D_0435,dms.directory_089_benchmark,,,, +dms.directory_436_benchmark,D_0436,dms.directory_165_benchmark,,,, +dms.directory_437_benchmark,D_0437,dms.directory_346_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_438_benchmark,D_0438,dms.directory_312_benchmark,,,dms.category_025_benchmark,dms.tag_112_benchmark +dms.directory_439_benchmark,D_0439,dms.directory_330_benchmark,,,dms.category_017_benchmark,dms.tag_011_benchmark +dms.directory_440_benchmark,D_0440,dms.directory_288_benchmark,,,,dms.tag_134_benchmark +dms.directory_441_benchmark,D_0441,dms.directory_342_benchmark,,,dms.category_037_benchmark,dms.tag_088_benchmark +dms.directory_442_benchmark,D_0442,dms.directory_406_benchmark,,,dms.category_021_benchmark,dms.tag_026_benchmark +dms.directory_443_benchmark,D_0443,dms.directory_181_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_444_benchmark,D_0444,dms.directory_096_benchmark,,,dms.category_012_benchmark,dms.tag_057_benchmark +dms.directory_445_benchmark,D_0445,dms.directory_432_benchmark,,,dms.category_041_benchmark,dms.tag_087_benchmark +dms.directory_446_benchmark,D_0446,dms.directory_309_benchmark,,,,dms.tag_009_benchmark +dms.directory_447_benchmark,D_0447,dms.directory_230_benchmark,,,dms.category_043_benchmark,dms.tag_138_benchmark +dms.directory_448_benchmark,D_0448,dms.directory_035_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_449_benchmark,D_0449,dms.directory_262_benchmark,,,,dms.tag_015_benchmark +dms.directory_450_benchmark,D_0450,dms.directory_286_benchmark,,,dms.category_025_benchmark,dms.tag_028_benchmark +dms.directory_451_benchmark,D_0451,dms.directory_153_benchmark,,,dms.category_032_benchmark,dms.tag_064_benchmark +dms.directory_452_benchmark,D_0452,dms.directory_419_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_453_benchmark,D_0453,dms.directory_320_benchmark,,,dms.category_040_benchmark,dms.tag_024_benchmark +dms.directory_454_benchmark,D_0454,dms.directory_333_benchmark,,,,dms.tag_090_benchmark +dms.directory_455_benchmark,D_0455,dms.directory_362_benchmark,,,dms.category_046_benchmark,dms.tag_062_benchmark +dms.directory_456_benchmark,D_0456,dms.directory_334_benchmark,,,dms.category_028_benchmark,dms.tag_052_benchmark +dms.directory_457_benchmark,D_0457,dms.directory_340_benchmark,,,dms.category_043_benchmark,dms.tag_139_benchmark +dms.directory_458_benchmark,D_0458,dms.directory_365_benchmark,,,dms.category_033_benchmark,dms.tag_039_benchmark +dms.directory_459_benchmark,D_0459,dms.directory_291_benchmark,,,,dms.tag_046_benchmark +dms.directory_460_benchmark,D_0460,dms.directory_420_benchmark,,,,dms.tag_016_benchmark +dms.directory_461_benchmark,D_0461,dms.directory_390_benchmark,,,dms.category_050_benchmark,dms.tag_117_benchmark +dms.directory_462_benchmark,D_0462,dms.directory_021_benchmark,,,dms.category_027_benchmark,dms.tag_048_benchmark +dms.directory_463_benchmark,D_0463,dms.directory_402_benchmark,,,dms.category_021_benchmark,dms.tag_136_benchmark +dms.directory_464_benchmark,D_0464,dms.directory_041_benchmark,,,dms.category_040_benchmark,dms.tag_126_benchmark +dms.directory_465_benchmark,D_0465,dms.directory_053_benchmark,,,dms.category_008_benchmark,dms.tag_077_benchmark +dms.directory_466_benchmark,D_0466,dms.directory_446_benchmark,,,,dms.tag_123_benchmark +dms.directory_467_benchmark,D_0467,dms.directory_359_benchmark,,,dms.category_041_benchmark,dms.tag_115_benchmark +dms.directory_468_benchmark,D_0468,dms.directory_321_benchmark,,,dms.category_015_benchmark,dms.tag_056_benchmark +dms.directory_469_benchmark,D_0469,dms.directory_023_benchmark,,,dms.category_014_benchmark,dms.tag_103_benchmark +dms.directory_470_benchmark,D_0470,dms.directory_103_benchmark,,,dms.category_019_benchmark,dms.tag_125_benchmark +dms.directory_471_benchmark,D_0471,dms.directory_468_benchmark,,,dms.category_023_benchmark,dms.tag_085_benchmark +dms.directory_472_benchmark,D_0472,dms.directory_047_benchmark,,,dms.category_049_benchmark,dms.tag_035_benchmark +dms.directory_473_benchmark,D_0473,dms.directory_254_benchmark,,,dms.category_019_benchmark,dms.tag_125_benchmark +dms.directory_474_benchmark,D_0474,dms.directory_200_benchmark,,,dms.category_018_benchmark,dms.tag_133_benchmark +dms.directory_475_benchmark,D_0475,dms.directory_247_benchmark,,,dms.category_011_benchmark,dms.tag_144_benchmark +dms.directory_476_benchmark,D_0476,dms.directory_099_benchmark,,,dms.category_018_benchmark,dms.tag_018_benchmark +dms.directory_477_benchmark,D_0477,dms.directory_258_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_478_benchmark,D_0478,dms.directory_235_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_479_benchmark,D_0479,dms.directory_361_benchmark,,,dms.category_031_benchmark,dms.tag_111_benchmark +dms.directory_480_benchmark,D_0480,dms.directory_027_benchmark,,,dms.category_013_benchmark,dms.tag_068_benchmark +dms.directory_481_benchmark,D_0481,dms.directory_207_benchmark,,,dms.category_041_benchmark,dms.tag_053_benchmark +dms.directory_482_benchmark,D_0482,dms.directory_331_benchmark,,,,dms.tag_123_benchmark +dms.directory_483_benchmark,D_0483,dms.directory_381_benchmark,,,,dms.tag_063_benchmark +dms.directory_484_benchmark,D_0484,dms.directory_180_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_485_benchmark,D_0485,dms.directory_470_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark +dms.directory_486_benchmark,D_0486,dms.directory_160_benchmark,,,dms.category_024_benchmark,dms.tag_084_benchmark +dms.directory_487_benchmark,D_0487,dms.directory_307_benchmark,,,dms.category_014_benchmark,dms.tag_107_benchmark +dms.directory_488_benchmark,D_0488,dms.directory_376_benchmark,,,,dms.tag_090_benchmark +dms.directory_489_benchmark,D_0489,dms.directory_371_benchmark,,,dms.category_005_benchmark,dms.tag_058_benchmark +dms.directory_490_benchmark,D_0490,dms.directory_329_benchmark,,,,dms.tag_086_benchmark +dms.directory_491_benchmark,D_0491,dms.directory_065_benchmark,,,dms.category_022_benchmark,dms.tag_020_benchmark +dms.directory_492_benchmark,D_0492,dms.directory_159_benchmark,,,, +dms.directory_493_benchmark,D_0493,dms.directory_261_benchmark,,,dms.category_037_benchmark,dms.tag_030_benchmark +dms.directory_494_benchmark,D_0494,dms.directory_398_benchmark,,,dms.category_041_benchmark,dms.tag_036_benchmark +dms.directory_495_benchmark,D_0495,dms.directory_028_benchmark,,,dms.category_031_benchmark,dms.tag_114_benchmark +dms.directory_496_benchmark,D_0496,dms.directory_284_benchmark,,,dms.category_025_benchmark,dms.tag_082_benchmark +dms.directory_497_benchmark,D_0497,dms.directory_160_benchmark,,,dms.category_005_benchmark,dms.tag_121_benchmark +dms.directory_498_benchmark,D_0498,dms.directory_321_benchmark,,,, +dms.directory_499_benchmark,D_0499,dms.directory_075_benchmark,,,,dms.tag_086_benchmark +dms.directory_500_benchmark,D_0500,dms.directory_385_benchmark,,,dms.category_001_benchmark,dms.tag_143_benchmark diff --git a/dms/tests/data/dms.file.csv b/dms/tests/data/dms.file.csv new file mode 100644 index 000000000..ee9eb58e1 --- /dev/null +++ b/dms/tests/data/dms.file.csv @@ -0,0 +1,1501 @@ +id,name,directory_id/id,category_id/id,tag_ids/id,content +dms.file_0001_benchmark,F_0001.txt,dms.directory_152_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0002_benchmark,F_0002.txt,dms.directory_456_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0003_benchmark,F_0003.txt,dms.directory_183_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0004_benchmark,F_0004.txt,dms.directory_024_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0005_benchmark,F_0005.txt,dms.directory_305_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0006_benchmark,F_0006.txt,dms.directory_449_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0007_benchmark,F_0007.txt,dms.directory_178_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0008_benchmark,F_0008.txt,dms.directory_406_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0009_benchmark,F_0009.txt,dms.directory_405_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0010_benchmark,F_0010.txt,dms.directory_050_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0011_benchmark,F_0011.txt,dms.directory_120_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0012_benchmark,F_0012.txt,dms.directory_010_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0013_benchmark,F_0013.txt,dms.directory_214_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0014_benchmark,F_0014.txt,dms.directory_490_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0015_benchmark,F_0015.txt,dms.directory_435_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0016_benchmark,F_0016.txt,dms.directory_337_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0017_benchmark,F_0017.txt,dms.directory_146_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0018_benchmark,F_0018.txt,dms.directory_260_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0019_benchmark,F_0019.txt,dms.directory_483_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0020_benchmark,F_0020.txt,dms.directory_200_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0021_benchmark,F_0021.txt,dms.directory_426_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0022_benchmark,F_0022.txt,dms.directory_284_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0023_benchmark,F_0023.txt,dms.directory_463_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0024_benchmark,F_0024.txt,dms.directory_010_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0025_benchmark,F_0025.txt,dms.directory_077_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0026_benchmark,F_0026.txt,dms.directory_131_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0027_benchmark,F_0027.txt,dms.directory_072_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0028_benchmark,F_0028.txt,dms.directory_439_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0029_benchmark,F_0029.txt,dms.directory_314_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0030_benchmark,F_0030.txt,dms.directory_049_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0031_benchmark,F_0031.txt,dms.directory_272_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0032_benchmark,F_0032.txt,dms.directory_193_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0033_benchmark,F_0033.txt,dms.directory_151_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0034_benchmark,F_0034.txt,dms.directory_482_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0035_benchmark,F_0035.txt,dms.directory_317_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0036_benchmark,F_0036.txt,dms.directory_203_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0037_benchmark,F_0037.txt,dms.directory_291_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0038_benchmark,F_0038.txt,dms.directory_191_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0039_benchmark,F_0039.txt,dms.directory_463_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0040_benchmark,F_0040.txt,dms.directory_036_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0041_benchmark,F_0041.txt,dms.directory_280_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0042_benchmark,F_0042.txt,dms.directory_366_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0043_benchmark,F_0043.txt,dms.directory_322_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0044_benchmark,F_0044.txt,dms.directory_271_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0045_benchmark,F_0045.txt,dms.directory_339_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0046_benchmark,F_0046.txt,dms.directory_011_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0047_benchmark,F_0047.txt,dms.directory_281_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0048_benchmark,F_0048.txt,dms.directory_314_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0049_benchmark,F_0049.txt,dms.directory_022_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0050_benchmark,F_0050.txt,dms.directory_308_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0051_benchmark,F_0051.txt,dms.directory_138_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0052_benchmark,F_0052.txt,dms.directory_332_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0053_benchmark,F_0053.txt,dms.directory_173_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0054_benchmark,F_0054.txt,dms.directory_499_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0055_benchmark,F_0055.txt,dms.directory_184_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0056_benchmark,F_0056.txt,dms.directory_067_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0057_benchmark,F_0057.txt,dms.directory_196_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0058_benchmark,F_0058.txt,dms.directory_222_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0059_benchmark,F_0059.txt,dms.directory_360_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0060_benchmark,F_0060.txt,dms.directory_260_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0061_benchmark,F_0061.txt,dms.directory_333_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0062_benchmark,F_0062.txt,dms.directory_491_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0063_benchmark,F_0063.txt,dms.directory_408_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0064_benchmark,F_0064.txt,dms.directory_210_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0065_benchmark,F_0065.txt,dms.directory_112_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0066_benchmark,F_0066.txt,dms.directory_090_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0067_benchmark,F_0067.txt,dms.directory_207_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0068_benchmark,F_0068.txt,dms.directory_078_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0069_benchmark,F_0069.txt,dms.directory_445_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0070_benchmark,F_0070.txt,dms.directory_408_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0071_benchmark,F_0071.txt,dms.directory_014_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0072_benchmark,F_0072.txt,dms.directory_065_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0073_benchmark,F_0073.txt,dms.directory_212_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0074_benchmark,F_0074.txt,dms.directory_297_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0075_benchmark,F_0075.txt,dms.directory_485_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0076_benchmark,F_0076.txt,dms.directory_341_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0077_benchmark,F_0077.txt,dms.directory_175_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0078_benchmark,F_0078.txt,dms.directory_202_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0079_benchmark,F_0079.txt,dms.directory_392_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0080_benchmark,F_0080.txt,dms.directory_336_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0081_benchmark,F_0081.txt,dms.directory_427_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0082_benchmark,F_0082.txt,dms.directory_404_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0083_benchmark,F_0083.txt,dms.directory_114_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0084_benchmark,F_0084.txt,dms.directory_281_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0085_benchmark,F_0085.txt,dms.directory_269_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0086_benchmark,F_0086.txt,dms.directory_145_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0087_benchmark,F_0087.txt,dms.directory_105_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0088_benchmark,F_0088.txt,dms.directory_452_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0089_benchmark,F_0089.txt,dms.directory_101_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0090_benchmark,F_0090.txt,dms.directory_387_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0091_benchmark,F_0091.txt,dms.directory_145_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0092_benchmark,F_0092.txt,dms.directory_320_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0093_benchmark,F_0093.txt,dms.directory_169_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0094_benchmark,F_0094.txt,dms.directory_171_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0095_benchmark,F_0095.txt,dms.directory_088_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0096_benchmark,F_0096.txt,dms.directory_471_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0097_benchmark,F_0097.txt,dms.directory_442_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0098_benchmark,F_0098.txt,dms.directory_104_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0099_benchmark,F_0099.txt,dms.directory_398_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0100_benchmark,F_0100.txt,dms.directory_197_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0101_benchmark,F_0101.txt,dms.directory_194_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0102_benchmark,F_0102.txt,dms.directory_298_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0103_benchmark,F_0103.txt,dms.directory_150_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0104_benchmark,F_0104.txt,dms.directory_287_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0105_benchmark,F_0105.txt,dms.directory_419_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0106_benchmark,F_0106.txt,dms.directory_355_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0107_benchmark,F_0107.txt,dms.directory_462_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0108_benchmark,F_0108.txt,dms.directory_386_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0109_benchmark,F_0109.txt,dms.directory_245_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0110_benchmark,F_0110.txt,dms.directory_309_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0111_benchmark,F_0111.txt,dms.directory_208_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0112_benchmark,F_0112.txt,dms.directory_416_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0113_benchmark,F_0113.txt,dms.directory_026_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0114_benchmark,F_0114.txt,dms.directory_253_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0115_benchmark,F_0115.txt,dms.directory_190_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0116_benchmark,F_0116.txt,dms.directory_017_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0117_benchmark,F_0117.txt,dms.directory_159_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0118_benchmark,F_0118.txt,dms.directory_094_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0119_benchmark,F_0119.txt,dms.directory_132_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0120_benchmark,F_0120.txt,dms.directory_278_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0121_benchmark,F_0121.txt,dms.directory_064_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0122_benchmark,F_0122.txt,dms.directory_141_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0123_benchmark,F_0123.txt,dms.directory_372_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0124_benchmark,F_0124.txt,dms.directory_074_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0125_benchmark,F_0125.txt,dms.directory_262_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0126_benchmark,F_0126.txt,dms.directory_466_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0127_benchmark,F_0127.txt,dms.directory_316_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0128_benchmark,F_0128.txt,dms.directory_411_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0129_benchmark,F_0129.txt,dms.directory_288_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0130_benchmark,F_0130.txt,dms.directory_401_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0131_benchmark,F_0131.txt,dms.directory_490_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0132_benchmark,F_0132.txt,dms.directory_317_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0133_benchmark,F_0133.txt,dms.directory_413_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0134_benchmark,F_0134.txt,dms.directory_063_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0135_benchmark,F_0135.txt,dms.directory_450_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0136_benchmark,F_0136.txt,dms.directory_268_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0137_benchmark,F_0137.txt,dms.directory_493_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0138_benchmark,F_0138.txt,dms.directory_252_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0139_benchmark,F_0139.txt,dms.directory_456_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0140_benchmark,F_0140.txt,dms.directory_134_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0141_benchmark,F_0141.txt,dms.directory_306_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0142_benchmark,F_0142.txt,dms.directory_074_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0143_benchmark,F_0143.txt,dms.directory_064_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0144_benchmark,F_0144.txt,dms.directory_330_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0145_benchmark,F_0145.txt,dms.directory_390_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0146_benchmark,F_0146.txt,dms.directory_409_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0147_benchmark,F_0147.txt,dms.directory_354_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0148_benchmark,F_0148.txt,dms.directory_335_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0149_benchmark,F_0149.txt,dms.directory_032_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0150_benchmark,F_0150.txt,dms.directory_164_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0151_benchmark,F_0151.txt,dms.directory_202_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0152_benchmark,F_0152.txt,dms.directory_456_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0153_benchmark,F_0153.txt,dms.directory_250_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0154_benchmark,F_0154.txt,dms.directory_252_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0155_benchmark,F_0155.txt,dms.directory_451_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0156_benchmark,F_0156.txt,dms.directory_151_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0157_benchmark,F_0157.txt,dms.directory_369_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0158_benchmark,F_0158.txt,dms.directory_409_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0159_benchmark,F_0159.txt,dms.directory_061_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0160_benchmark,F_0160.txt,dms.directory_403_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0161_benchmark,F_0161.txt,dms.directory_135_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0162_benchmark,F_0162.txt,dms.directory_273_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0163_benchmark,F_0163.txt,dms.directory_028_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0164_benchmark,F_0164.txt,dms.directory_146_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0165_benchmark,F_0165.txt,dms.directory_470_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0166_benchmark,F_0166.txt,dms.directory_132_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0167_benchmark,F_0167.txt,dms.directory_237_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0168_benchmark,F_0168.txt,dms.directory_330_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0169_benchmark,F_0169.txt,dms.directory_163_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0170_benchmark,F_0170.txt,dms.directory_355_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0171_benchmark,F_0171.txt,dms.directory_154_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0172_benchmark,F_0172.txt,dms.directory_155_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0173_benchmark,F_0173.txt,dms.directory_125_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0174_benchmark,F_0174.txt,dms.directory_214_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0175_benchmark,F_0175.txt,dms.directory_081_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0176_benchmark,F_0176.txt,dms.directory_238_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0177_benchmark,F_0177.txt,dms.directory_079_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0178_benchmark,F_0178.txt,dms.directory_384_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0179_benchmark,F_0179.txt,dms.directory_174_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0180_benchmark,F_0180.txt,dms.directory_444_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0181_benchmark,F_0181.txt,dms.directory_184_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0182_benchmark,F_0182.txt,dms.directory_115_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0183_benchmark,F_0183.txt,dms.directory_414_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0184_benchmark,F_0184.txt,dms.directory_267_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0185_benchmark,F_0185.txt,dms.directory_231_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0186_benchmark,F_0186.txt,dms.directory_207_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0187_benchmark,F_0187.txt,dms.directory_461_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0188_benchmark,F_0188.txt,dms.directory_146_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0189_benchmark,F_0189.txt,dms.directory_395_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0190_benchmark,F_0190.txt,dms.directory_218_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0191_benchmark,F_0191.txt,dms.directory_459_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0192_benchmark,F_0192.txt,dms.directory_129_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0193_benchmark,F_0193.txt,dms.directory_327_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0194_benchmark,F_0194.txt,dms.directory_438_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0195_benchmark,F_0195.txt,dms.directory_444_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0196_benchmark,F_0196.txt,dms.directory_025_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0197_benchmark,F_0197.txt,dms.directory_444_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0198_benchmark,F_0198.txt,dms.directory_494_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0199_benchmark,F_0199.txt,dms.directory_432_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0200_benchmark,F_0200.txt,dms.directory_209_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0201_benchmark,F_0201.txt,dms.directory_182_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0202_benchmark,F_0202.txt,dms.directory_214_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0203_benchmark,F_0203.txt,dms.directory_490_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0204_benchmark,F_0204.txt,dms.directory_272_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0205_benchmark,F_0205.txt,dms.directory_163_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0206_benchmark,F_0206.txt,dms.directory_435_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0207_benchmark,F_0207.txt,dms.directory_068_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0208_benchmark,F_0208.txt,dms.directory_459_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0209_benchmark,F_0209.txt,dms.directory_413_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0210_benchmark,F_0210.txt,dms.directory_128_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0211_benchmark,F_0211.txt,dms.directory_417_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0212_benchmark,F_0212.txt,dms.directory_278_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0213_benchmark,F_0213.txt,dms.directory_212_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0214_benchmark,F_0214.txt,dms.directory_277_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0215_benchmark,F_0215.txt,dms.directory_291_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0216_benchmark,F_0216.txt,dms.directory_074_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0217_benchmark,F_0217.txt,dms.directory_154_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0218_benchmark,F_0218.txt,dms.directory_466_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0219_benchmark,F_0219.txt,dms.directory_103_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0220_benchmark,F_0220.txt,dms.directory_396_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0221_benchmark,F_0221.txt,dms.directory_467_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0222_benchmark,F_0222.txt,dms.directory_300_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0223_benchmark,F_0223.txt,dms.directory_168_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0224_benchmark,F_0224.txt,dms.directory_313_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0225_benchmark,F_0225.txt,dms.directory_103_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0226_benchmark,F_0226.txt,dms.directory_175_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0227_benchmark,F_0227.txt,dms.directory_283_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0228_benchmark,F_0228.txt,dms.directory_494_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0229_benchmark,F_0229.txt,dms.directory_452_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0230_benchmark,F_0230.txt,dms.directory_393_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0231_benchmark,F_0231.txt,dms.directory_122_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0232_benchmark,F_0232.txt,dms.directory_186_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0233_benchmark,F_0233.txt,dms.directory_314_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0234_benchmark,F_0234.txt,dms.directory_075_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0235_benchmark,F_0235.txt,dms.directory_092_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0236_benchmark,F_0236.txt,dms.directory_379_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0237_benchmark,F_0237.txt,dms.directory_412_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0238_benchmark,F_0238.txt,dms.directory_308_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0239_benchmark,F_0239.txt,dms.directory_389_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0240_benchmark,F_0240.txt,dms.directory_145_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0241_benchmark,F_0241.txt,dms.directory_126_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0242_benchmark,F_0242.txt,dms.directory_025_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0243_benchmark,F_0243.txt,dms.directory_428_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0244_benchmark,F_0244.txt,dms.directory_295_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0245_benchmark,F_0245.txt,dms.directory_083_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0246_benchmark,F_0246.txt,dms.directory_436_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0247_benchmark,F_0247.txt,dms.directory_449_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0248_benchmark,F_0248.txt,dms.directory_256_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0249_benchmark,F_0249.txt,dms.directory_343_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0250_benchmark,F_0250.txt,dms.directory_067_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0251_benchmark,F_0251.txt,dms.directory_363_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0252_benchmark,F_0252.txt,dms.directory_275_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0253_benchmark,F_0253.txt,dms.directory_360_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0254_benchmark,F_0254.txt,dms.directory_395_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0255_benchmark,F_0255.txt,dms.directory_426_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0256_benchmark,F_0256.txt,dms.directory_074_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0257_benchmark,F_0257.txt,dms.directory_098_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0258_benchmark,F_0258.txt,dms.directory_358_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0259_benchmark,F_0259.txt,dms.directory_322_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0260_benchmark,F_0260.txt,dms.directory_150_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0261_benchmark,F_0261.txt,dms.directory_117_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0262_benchmark,F_0262.txt,dms.directory_122_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0263_benchmark,F_0263.txt,dms.directory_268_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0264_benchmark,F_0264.txt,dms.directory_298_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0265_benchmark,F_0265.txt,dms.directory_254_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0266_benchmark,F_0266.txt,dms.directory_171_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0267_benchmark,F_0267.txt,dms.directory_298_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0268_benchmark,F_0268.txt,dms.directory_057_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0269_benchmark,F_0269.txt,dms.directory_011_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0270_benchmark,F_0270.txt,dms.directory_154_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0271_benchmark,F_0271.txt,dms.directory_162_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0272_benchmark,F_0272.txt,dms.directory_406_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0273_benchmark,F_0273.txt,dms.directory_118_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0274_benchmark,F_0274.txt,dms.directory_256_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0275_benchmark,F_0275.txt,dms.directory_453_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0276_benchmark,F_0276.txt,dms.directory_024_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0277_benchmark,F_0277.txt,dms.directory_237_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0278_benchmark,F_0278.txt,dms.directory_039_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0279_benchmark,F_0279.txt,dms.directory_134_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0280_benchmark,F_0280.txt,dms.directory_085_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0281_benchmark,F_0281.txt,dms.directory_113_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0282_benchmark,F_0282.txt,dms.directory_091_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0283_benchmark,F_0283.txt,dms.directory_040_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0284_benchmark,F_0284.txt,dms.directory_141_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0285_benchmark,F_0285.txt,dms.directory_068_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0286_benchmark,F_0286.txt,dms.directory_105_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0287_benchmark,F_0287.txt,dms.directory_072_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0288_benchmark,F_0288.txt,dms.directory_479_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0289_benchmark,F_0289.txt,dms.directory_037_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0290_benchmark,F_0290.txt,dms.directory_337_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0291_benchmark,F_0291.txt,dms.directory_088_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0292_benchmark,F_0292.txt,dms.directory_329_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0293_benchmark,F_0293.txt,dms.directory_215_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0294_benchmark,F_0294.txt,dms.directory_269_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0295_benchmark,F_0295.txt,dms.directory_124_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0296_benchmark,F_0296.txt,dms.directory_188_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0297_benchmark,F_0297.txt,dms.directory_474_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0298_benchmark,F_0298.txt,dms.directory_220_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0299_benchmark,F_0299.txt,dms.directory_342_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0300_benchmark,F_0300.txt,dms.directory_194_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0301_benchmark,F_0301.txt,dms.directory_359_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0302_benchmark,F_0302.txt,dms.directory_198_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0303_benchmark,F_0303.txt,dms.directory_077_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0304_benchmark,F_0304.txt,dms.directory_203_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0305_benchmark,F_0305.txt,dms.directory_112_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0306_benchmark,F_0306.txt,dms.directory_314_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0307_benchmark,F_0307.txt,dms.directory_090_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0308_benchmark,F_0308.txt,dms.directory_488_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0309_benchmark,F_0309.txt,dms.directory_444_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0310_benchmark,F_0310.txt,dms.directory_277_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0311_benchmark,F_0311.txt,dms.directory_388_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0312_benchmark,F_0312.txt,dms.directory_461_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0313_benchmark,F_0313.txt,dms.directory_173_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0314_benchmark,F_0314.txt,dms.directory_012_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0315_benchmark,F_0315.txt,dms.directory_092_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0316_benchmark,F_0316.txt,dms.directory_299_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0317_benchmark,F_0317.txt,dms.directory_477_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0318_benchmark,F_0318.txt,dms.directory_442_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0319_benchmark,F_0319.txt,dms.directory_440_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0320_benchmark,F_0320.txt,dms.directory_211_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0321_benchmark,F_0321.txt,dms.directory_284_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0322_benchmark,F_0322.txt,dms.directory_347_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0323_benchmark,F_0323.txt,dms.directory_489_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0324_benchmark,F_0324.txt,dms.directory_393_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0325_benchmark,F_0325.txt,dms.directory_047_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0326_benchmark,F_0326.txt,dms.directory_362_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0327_benchmark,F_0327.txt,dms.directory_455_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0328_benchmark,F_0328.txt,dms.directory_021_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0329_benchmark,F_0329.txt,dms.directory_010_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0330_benchmark,F_0330.txt,dms.directory_327_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0331_benchmark,F_0331.txt,dms.directory_220_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0332_benchmark,F_0332.txt,dms.directory_190_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0333_benchmark,F_0333.txt,dms.directory_040_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0334_benchmark,F_0334.txt,dms.directory_013_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0335_benchmark,F_0335.txt,dms.directory_184_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0336_benchmark,F_0336.txt,dms.directory_212_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0337_benchmark,F_0337.txt,dms.directory_458_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0338_benchmark,F_0338.txt,dms.directory_015_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0339_benchmark,F_0339.txt,dms.directory_131_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0340_benchmark,F_0340.txt,dms.directory_261_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0341_benchmark,F_0341.txt,dms.directory_308_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0342_benchmark,F_0342.txt,dms.directory_343_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0343_benchmark,F_0343.txt,dms.directory_077_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0344_benchmark,F_0344.txt,dms.directory_327_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0345_benchmark,F_0345.txt,dms.directory_052_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0346_benchmark,F_0346.txt,dms.directory_125_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0347_benchmark,F_0347.txt,dms.directory_310_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0348_benchmark,F_0348.txt,dms.directory_181_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0349_benchmark,F_0349.txt,dms.directory_066_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0350_benchmark,F_0350.txt,dms.directory_438_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0351_benchmark,F_0351.txt,dms.directory_416_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0352_benchmark,F_0352.txt,dms.directory_190_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0353_benchmark,F_0353.txt,dms.directory_033_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0354_benchmark,F_0354.txt,dms.directory_256_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0355_benchmark,F_0355.txt,dms.directory_082_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0356_benchmark,F_0356.txt,dms.directory_018_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0357_benchmark,F_0357.txt,dms.directory_074_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0358_benchmark,F_0358.txt,dms.directory_260_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0359_benchmark,F_0359.txt,dms.directory_398_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0360_benchmark,F_0360.txt,dms.directory_104_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0361_benchmark,F_0361.txt,dms.directory_137_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0362_benchmark,F_0362.txt,dms.directory_225_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0363_benchmark,F_0363.txt,dms.directory_230_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0364_benchmark,F_0364.txt,dms.directory_103_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0365_benchmark,F_0365.txt,dms.directory_276_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0366_benchmark,F_0366.txt,dms.directory_181_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0367_benchmark,F_0367.txt,dms.directory_331_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0368_benchmark,F_0368.txt,dms.directory_222_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0369_benchmark,F_0369.txt,dms.directory_498_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0370_benchmark,F_0370.txt,dms.directory_041_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0371_benchmark,F_0371.txt,dms.directory_007_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0372_benchmark,F_0372.txt,dms.directory_293_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0373_benchmark,F_0373.txt,dms.directory_028_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0374_benchmark,F_0374.txt,dms.directory_354_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0375_benchmark,F_0375.txt,dms.directory_031_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0376_benchmark,F_0376.txt,dms.directory_338_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0377_benchmark,F_0377.txt,dms.directory_336_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0378_benchmark,F_0378.txt,dms.directory_169_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0379_benchmark,F_0379.txt,dms.directory_044_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0380_benchmark,F_0380.txt,dms.directory_442_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0381_benchmark,F_0381.txt,dms.directory_147_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0382_benchmark,F_0382.txt,dms.directory_413_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0383_benchmark,F_0383.txt,dms.directory_059_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0384_benchmark,F_0384.txt,dms.directory_235_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0385_benchmark,F_0385.txt,dms.directory_051_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0386_benchmark,F_0386.txt,dms.directory_235_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0387_benchmark,F_0387.txt,dms.directory_278_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0388_benchmark,F_0388.txt,dms.directory_474_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0389_benchmark,F_0389.txt,dms.directory_290_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0390_benchmark,F_0390.txt,dms.directory_164_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0391_benchmark,F_0391.txt,dms.directory_275_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0392_benchmark,F_0392.txt,dms.directory_041_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0393_benchmark,F_0393.txt,dms.directory_168_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0394_benchmark,F_0394.txt,dms.directory_457_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0395_benchmark,F_0395.txt,dms.directory_274_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0396_benchmark,F_0396.txt,dms.directory_261_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0397_benchmark,F_0397.txt,dms.directory_481_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0398_benchmark,F_0398.txt,dms.directory_161_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0399_benchmark,F_0399.txt,dms.directory_173_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0400_benchmark,F_0400.txt,dms.directory_238_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0401_benchmark,F_0401.txt,dms.directory_382_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0402_benchmark,F_0402.txt,dms.directory_019_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0403_benchmark,F_0403.txt,dms.directory_201_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0404_benchmark,F_0404.txt,dms.directory_211_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0405_benchmark,F_0405.txt,dms.directory_155_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0406_benchmark,F_0406.txt,dms.directory_159_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0407_benchmark,F_0407.txt,dms.directory_188_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0408_benchmark,F_0408.txt,dms.directory_252_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0409_benchmark,F_0409.txt,dms.directory_410_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0410_benchmark,F_0410.txt,dms.directory_470_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0411_benchmark,F_0411.txt,dms.directory_028_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0412_benchmark,F_0412.txt,dms.directory_064_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0413_benchmark,F_0413.txt,dms.directory_440_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0414_benchmark,F_0414.txt,dms.directory_184_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0415_benchmark,F_0415.txt,dms.directory_396_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0416_benchmark,F_0416.txt,dms.directory_336_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0417_benchmark,F_0417.txt,dms.directory_204_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0418_benchmark,F_0418.txt,dms.directory_124_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0419_benchmark,F_0419.txt,dms.directory_032_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0420_benchmark,F_0420.txt,dms.directory_343_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0421_benchmark,F_0421.txt,dms.directory_114_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0422_benchmark,F_0422.txt,dms.directory_050_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0423_benchmark,F_0423.txt,dms.directory_020_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0424_benchmark,F_0424.txt,dms.directory_152_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0425_benchmark,F_0425.txt,dms.directory_140_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0426_benchmark,F_0426.txt,dms.directory_175_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0427_benchmark,F_0427.txt,dms.directory_231_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0428_benchmark,F_0428.txt,dms.directory_069_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0429_benchmark,F_0429.txt,dms.directory_094_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0430_benchmark,F_0430.txt,dms.directory_379_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0431_benchmark,F_0431.txt,dms.directory_161_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0432_benchmark,F_0432.txt,dms.directory_483_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0433_benchmark,F_0433.txt,dms.directory_043_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0434_benchmark,F_0434.txt,dms.directory_313_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0435_benchmark,F_0435.txt,dms.directory_339_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0436_benchmark,F_0436.txt,dms.directory_118_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0437_benchmark,F_0437.txt,dms.directory_373_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0438_benchmark,F_0438.txt,dms.directory_496_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0439_benchmark,F_0439.txt,dms.directory_343_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0440_benchmark,F_0440.txt,dms.directory_422_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0441_benchmark,F_0441.txt,dms.directory_288_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0442_benchmark,F_0442.txt,dms.directory_389_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0443_benchmark,F_0443.txt,dms.directory_128_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0444_benchmark,F_0444.txt,dms.directory_266_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0445_benchmark,F_0445.txt,dms.directory_438_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0446_benchmark,F_0446.txt,dms.directory_028_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0447_benchmark,F_0447.txt,dms.directory_087_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0448_benchmark,F_0448.txt,dms.directory_214_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0449_benchmark,F_0449.txt,dms.directory_048_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0450_benchmark,F_0450.txt,dms.directory_375_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0451_benchmark,F_0451.txt,dms.directory_271_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0452_benchmark,F_0452.txt,dms.directory_286_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0453_benchmark,F_0453.txt,dms.directory_271_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0454_benchmark,F_0454.txt,dms.directory_145_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0455_benchmark,F_0455.txt,dms.directory_096_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0456_benchmark,F_0456.txt,dms.directory_146_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0457_benchmark,F_0457.txt,dms.directory_136_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0458_benchmark,F_0458.txt,dms.directory_190_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0459_benchmark,F_0459.txt,dms.directory_449_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0460_benchmark,F_0460.txt,dms.directory_172_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0461_benchmark,F_0461.txt,dms.directory_127_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0462_benchmark,F_0462.txt,dms.directory_219_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0463_benchmark,F_0463.txt,dms.directory_095_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0464_benchmark,F_0464.txt,dms.directory_296_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0465_benchmark,F_0465.txt,dms.directory_321_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0466_benchmark,F_0466.txt,dms.directory_252_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0467_benchmark,F_0467.txt,dms.directory_297_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0468_benchmark,F_0468.txt,dms.directory_338_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0469_benchmark,F_0469.txt,dms.directory_277_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0470_benchmark,F_0470.txt,dms.directory_457_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0471_benchmark,F_0471.txt,dms.directory_011_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0472_benchmark,F_0472.txt,dms.directory_273_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0473_benchmark,F_0473.txt,dms.directory_011_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0474_benchmark,F_0474.txt,dms.directory_246_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0475_benchmark,F_0475.txt,dms.directory_129_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0476_benchmark,F_0476.txt,dms.directory_248_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0477_benchmark,F_0477.txt,dms.directory_024_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0478_benchmark,F_0478.txt,dms.directory_121_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0479_benchmark,F_0479.txt,dms.directory_097_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0480_benchmark,F_0480.txt,dms.directory_184_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0481_benchmark,F_0481.txt,dms.directory_347_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0482_benchmark,F_0482.txt,dms.directory_448_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0483_benchmark,F_0483.txt,dms.directory_283_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0484_benchmark,F_0484.txt,dms.directory_409_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0485_benchmark,F_0485.txt,dms.directory_090_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0486_benchmark,F_0486.txt,dms.directory_172_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0487_benchmark,F_0487.txt,dms.directory_096_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0488_benchmark,F_0488.txt,dms.directory_334_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0489_benchmark,F_0489.txt,dms.directory_145_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0490_benchmark,F_0490.txt,dms.directory_383_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0491_benchmark,F_0491.txt,dms.directory_222_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0492_benchmark,F_0492.txt,dms.directory_007_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0493_benchmark,F_0493.txt,dms.directory_483_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0494_benchmark,F_0494.txt,dms.directory_276_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0495_benchmark,F_0495.txt,dms.directory_476_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0496_benchmark,F_0496.txt,dms.directory_142_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0497_benchmark,F_0497.txt,dms.directory_500_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0498_benchmark,F_0498.txt,dms.directory_327_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0499_benchmark,F_0499.txt,dms.directory_260_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0500_benchmark,F_0500.txt,dms.directory_205_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0501_benchmark,F_0501.txt,dms.directory_354_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0502_benchmark,F_0502.txt,dms.directory_302_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0503_benchmark,F_0503.txt,dms.directory_486_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0504_benchmark,F_0504.txt,dms.directory_056_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0505_benchmark,F_0505.txt,dms.directory_037_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0506_benchmark,F_0506.txt,dms.directory_205_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0507_benchmark,F_0507.txt,dms.directory_291_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0508_benchmark,F_0508.txt,dms.directory_445_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0509_benchmark,F_0509.txt,dms.directory_344_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0510_benchmark,F_0510.txt,dms.directory_133_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0511_benchmark,F_0511.txt,dms.directory_453_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0512_benchmark,F_0512.txt,dms.directory_046_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0513_benchmark,F_0513.txt,dms.directory_287_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0514_benchmark,F_0514.txt,dms.directory_150_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0515_benchmark,F_0515.txt,dms.directory_325_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0516_benchmark,F_0516.txt,dms.directory_136_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0517_benchmark,F_0517.txt,dms.directory_424_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0518_benchmark,F_0518.txt,dms.directory_163_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0519_benchmark,F_0519.txt,dms.directory_452_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0520_benchmark,F_0520.txt,dms.directory_365_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0521_benchmark,F_0521.txt,dms.directory_244_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0522_benchmark,F_0522.txt,dms.directory_373_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0523_benchmark,F_0523.txt,dms.directory_327_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0524_benchmark,F_0524.txt,dms.directory_127_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0525_benchmark,F_0525.txt,dms.directory_407_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0526_benchmark,F_0526.txt,dms.directory_367_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0527_benchmark,F_0527.txt,dms.directory_334_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0528_benchmark,F_0528.txt,dms.directory_183_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0529_benchmark,F_0529.txt,dms.directory_303_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0530_benchmark,F_0530.txt,dms.directory_310_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0531_benchmark,F_0531.txt,dms.directory_256_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0532_benchmark,F_0532.txt,dms.directory_036_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0533_benchmark,F_0533.txt,dms.directory_104_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0534_benchmark,F_0534.txt,dms.directory_481_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0535_benchmark,F_0535.txt,dms.directory_047_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0536_benchmark,F_0536.txt,dms.directory_477_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0537_benchmark,F_0537.txt,dms.directory_477_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0538_benchmark,F_0538.txt,dms.directory_381_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0539_benchmark,F_0539.txt,dms.directory_343_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0540_benchmark,F_0540.txt,dms.directory_302_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0541_benchmark,F_0541.txt,dms.directory_108_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0542_benchmark,F_0542.txt,dms.directory_146_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0543_benchmark,F_0543.txt,dms.directory_450_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0544_benchmark,F_0544.txt,dms.directory_489_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0545_benchmark,F_0545.txt,dms.directory_255_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0546_benchmark,F_0546.txt,dms.directory_083_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0547_benchmark,F_0547.txt,dms.directory_128_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0548_benchmark,F_0548.txt,dms.directory_479_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0549_benchmark,F_0549.txt,dms.directory_374_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0550_benchmark,F_0550.txt,dms.directory_009_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0551_benchmark,F_0551.txt,dms.directory_491_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0552_benchmark,F_0552.txt,dms.directory_230_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0553_benchmark,F_0553.txt,dms.directory_324_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0554_benchmark,F_0554.txt,dms.directory_244_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0555_benchmark,F_0555.txt,dms.directory_264_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0556_benchmark,F_0556.txt,dms.directory_073_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0557_benchmark,F_0557.txt,dms.directory_379_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0558_benchmark,F_0558.txt,dms.directory_019_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0559_benchmark,F_0559.txt,dms.directory_106_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0560_benchmark,F_0560.txt,dms.directory_143_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0561_benchmark,F_0561.txt,dms.directory_278_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0562_benchmark,F_0562.txt,dms.directory_216_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0563_benchmark,F_0563.txt,dms.directory_418_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0564_benchmark,F_0564.txt,dms.directory_132_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0565_benchmark,F_0565.txt,dms.directory_258_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0566_benchmark,F_0566.txt,dms.directory_436_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0567_benchmark,F_0567.txt,dms.directory_018_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0568_benchmark,F_0568.txt,dms.directory_344_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0569_benchmark,F_0569.txt,dms.directory_038_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0570_benchmark,F_0570.txt,dms.directory_328_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0571_benchmark,F_0571.txt,dms.directory_159_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0572_benchmark,F_0572.txt,dms.directory_005_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0573_benchmark,F_0573.txt,dms.directory_470_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0574_benchmark,F_0574.txt,dms.directory_498_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0575_benchmark,F_0575.txt,dms.directory_161_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0576_benchmark,F_0576.txt,dms.directory_338_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0577_benchmark,F_0577.txt,dms.directory_346_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0578_benchmark,F_0578.txt,dms.directory_024_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0579_benchmark,F_0579.txt,dms.directory_318_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0580_benchmark,F_0580.txt,dms.directory_410_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0581_benchmark,F_0581.txt,dms.directory_324_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0582_benchmark,F_0582.txt,dms.directory_207_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0583_benchmark,F_0583.txt,dms.directory_459_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0584_benchmark,F_0584.txt,dms.directory_138_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0585_benchmark,F_0585.txt,dms.directory_104_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0586_benchmark,F_0586.txt,dms.directory_169_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0587_benchmark,F_0587.txt,dms.directory_123_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0588_benchmark,F_0588.txt,dms.directory_202_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0589_benchmark,F_0589.txt,dms.directory_208_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0590_benchmark,F_0590.txt,dms.directory_029_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0591_benchmark,F_0591.txt,dms.directory_412_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0592_benchmark,F_0592.txt,dms.directory_259_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0593_benchmark,F_0593.txt,dms.directory_339_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0594_benchmark,F_0594.txt,dms.directory_129_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0595_benchmark,F_0595.txt,dms.directory_495_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0596_benchmark,F_0596.txt,dms.directory_138_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0597_benchmark,F_0597.txt,dms.directory_292_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0598_benchmark,F_0598.txt,dms.directory_148_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0599_benchmark,F_0599.txt,dms.directory_286_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0600_benchmark,F_0600.txt,dms.directory_111_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0601_benchmark,F_0601.txt,dms.directory_349_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0602_benchmark,F_0602.txt,dms.directory_331_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0603_benchmark,F_0603.txt,dms.directory_054_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0604_benchmark,F_0604.txt,dms.directory_183_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0605_benchmark,F_0605.txt,dms.directory_170_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0606_benchmark,F_0606.txt,dms.directory_455_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0607_benchmark,F_0607.txt,dms.directory_348_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0608_benchmark,F_0608.txt,dms.directory_464_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0609_benchmark,F_0609.txt,dms.directory_414_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0610_benchmark,F_0610.txt,dms.directory_151_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0611_benchmark,F_0611.txt,dms.directory_311_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0612_benchmark,F_0612.txt,dms.directory_493_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0613_benchmark,F_0613.txt,dms.directory_262_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0614_benchmark,F_0614.txt,dms.directory_339_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0615_benchmark,F_0615.txt,dms.directory_262_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0616_benchmark,F_0616.txt,dms.directory_292_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0617_benchmark,F_0617.txt,dms.directory_370_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0618_benchmark,F_0618.txt,dms.directory_218_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0619_benchmark,F_0619.txt,dms.directory_438_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0620_benchmark,F_0620.txt,dms.directory_469_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0621_benchmark,F_0621.txt,dms.directory_174_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0622_benchmark,F_0622.txt,dms.directory_132_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0623_benchmark,F_0623.txt,dms.directory_427_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0624_benchmark,F_0624.txt,dms.directory_081_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0625_benchmark,F_0625.txt,dms.directory_015_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0626_benchmark,F_0626.txt,dms.directory_385_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0627_benchmark,F_0627.txt,dms.directory_158_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0628_benchmark,F_0628.txt,dms.directory_022_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0629_benchmark,F_0629.txt,dms.directory_378_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0630_benchmark,F_0630.txt,dms.directory_240_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0631_benchmark,F_0631.txt,dms.directory_299_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0632_benchmark,F_0632.txt,dms.directory_239_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0633_benchmark,F_0633.txt,dms.directory_428_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0634_benchmark,F_0634.txt,dms.directory_401_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0635_benchmark,F_0635.txt,dms.directory_048_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0636_benchmark,F_0636.txt,dms.directory_176_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0637_benchmark,F_0637.txt,dms.directory_037_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0638_benchmark,F_0638.txt,dms.directory_360_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0639_benchmark,F_0639.txt,dms.directory_452_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0640_benchmark,F_0640.txt,dms.directory_257_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0641_benchmark,F_0641.txt,dms.directory_453_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0642_benchmark,F_0642.txt,dms.directory_429_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0643_benchmark,F_0643.txt,dms.directory_468_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0644_benchmark,F_0644.txt,dms.directory_277_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0645_benchmark,F_0645.txt,dms.directory_240_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0646_benchmark,F_0646.txt,dms.directory_346_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0647_benchmark,F_0647.txt,dms.directory_067_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0648_benchmark,F_0648.txt,dms.directory_419_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0649_benchmark,F_0649.txt,dms.directory_275_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0650_benchmark,F_0650.txt,dms.directory_004_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0651_benchmark,F_0651.txt,dms.directory_359_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0652_benchmark,F_0652.txt,dms.directory_398_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0653_benchmark,F_0653.txt,dms.directory_045_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0654_benchmark,F_0654.txt,dms.directory_241_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0655_benchmark,F_0655.txt,dms.directory_299_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0656_benchmark,F_0656.txt,dms.directory_272_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0657_benchmark,F_0657.txt,dms.directory_139_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0658_benchmark,F_0658.txt,dms.directory_415_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0659_benchmark,F_0659.txt,dms.directory_111_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0660_benchmark,F_0660.txt,dms.directory_265_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0661_benchmark,F_0661.txt,dms.directory_439_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0662_benchmark,F_0662.txt,dms.directory_234_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0663_benchmark,F_0663.txt,dms.directory_310_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0664_benchmark,F_0664.txt,dms.directory_367_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0665_benchmark,F_0665.txt,dms.directory_163_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0666_benchmark,F_0666.txt,dms.directory_032_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0667_benchmark,F_0667.txt,dms.directory_319_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0668_benchmark,F_0668.txt,dms.directory_436_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0669_benchmark,F_0669.txt,dms.directory_162_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0670_benchmark,F_0670.txt,dms.directory_352_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0671_benchmark,F_0671.txt,dms.directory_462_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0672_benchmark,F_0672.txt,dms.directory_334_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0673_benchmark,F_0673.txt,dms.directory_456_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0674_benchmark,F_0674.txt,dms.directory_473_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0675_benchmark,F_0675.txt,dms.directory_085_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0676_benchmark,F_0676.txt,dms.directory_467_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0677_benchmark,F_0677.txt,dms.directory_268_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0678_benchmark,F_0678.txt,dms.directory_066_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0679_benchmark,F_0679.txt,dms.directory_006_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0680_benchmark,F_0680.txt,dms.directory_426_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0681_benchmark,F_0681.txt,dms.directory_011_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0682_benchmark,F_0682.txt,dms.directory_460_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0683_benchmark,F_0683.txt,dms.directory_053_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0684_benchmark,F_0684.txt,dms.directory_233_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0685_benchmark,F_0685.txt,dms.directory_330_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0686_benchmark,F_0686.txt,dms.directory_070_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0687_benchmark,F_0687.txt,dms.directory_418_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0688_benchmark,F_0688.txt,dms.directory_220_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0689_benchmark,F_0689.txt,dms.directory_488_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0690_benchmark,F_0690.txt,dms.directory_204_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0691_benchmark,F_0691.txt,dms.directory_426_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0692_benchmark,F_0692.txt,dms.directory_343_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0693_benchmark,F_0693.txt,dms.directory_423_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0694_benchmark,F_0694.txt,dms.directory_409_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0695_benchmark,F_0695.txt,dms.directory_427_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0696_benchmark,F_0696.txt,dms.directory_117_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0697_benchmark,F_0697.txt,dms.directory_222_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0698_benchmark,F_0698.txt,dms.directory_232_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0699_benchmark,F_0699.txt,dms.directory_277_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0700_benchmark,F_0700.txt,dms.directory_480_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0701_benchmark,F_0701.txt,dms.directory_002_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0702_benchmark,F_0702.txt,dms.directory_137_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0703_benchmark,F_0703.txt,dms.directory_409_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0704_benchmark,F_0704.txt,dms.directory_340_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0705_benchmark,F_0705.txt,dms.directory_499_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0706_benchmark,F_0706.txt,dms.directory_387_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0707_benchmark,F_0707.txt,dms.directory_487_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0708_benchmark,F_0708.txt,dms.directory_005_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0709_benchmark,F_0709.txt,dms.directory_322_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0710_benchmark,F_0710.txt,dms.directory_186_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0711_benchmark,F_0711.txt,dms.directory_085_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0712_benchmark,F_0712.txt,dms.directory_223_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0713_benchmark,F_0713.txt,dms.directory_092_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0714_benchmark,F_0714.txt,dms.directory_339_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0715_benchmark,F_0715.txt,dms.directory_453_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0716_benchmark,F_0716.txt,dms.directory_281_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0717_benchmark,F_0717.txt,dms.directory_167_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0718_benchmark,F_0718.txt,dms.directory_175_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0719_benchmark,F_0719.txt,dms.directory_403_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0720_benchmark,F_0720.txt,dms.directory_431_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0721_benchmark,F_0721.txt,dms.directory_426_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0722_benchmark,F_0722.txt,dms.directory_208_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0723_benchmark,F_0723.txt,dms.directory_469_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0724_benchmark,F_0724.txt,dms.directory_059_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0725_benchmark,F_0725.txt,dms.directory_331_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0726_benchmark,F_0726.txt,dms.directory_385_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0727_benchmark,F_0727.txt,dms.directory_140_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0728_benchmark,F_0728.txt,dms.directory_339_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0729_benchmark,F_0729.txt,dms.directory_024_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0730_benchmark,F_0730.txt,dms.directory_153_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0731_benchmark,F_0731.txt,dms.directory_143_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0732_benchmark,F_0732.txt,dms.directory_441_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0733_benchmark,F_0733.txt,dms.directory_316_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0734_benchmark,F_0734.txt,dms.directory_006_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0735_benchmark,F_0735.txt,dms.directory_461_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0736_benchmark,F_0736.txt,dms.directory_083_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0737_benchmark,F_0737.txt,dms.directory_098_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0738_benchmark,F_0738.txt,dms.directory_427_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0739_benchmark,F_0739.txt,dms.directory_126_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0740_benchmark,F_0740.txt,dms.directory_429_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0741_benchmark,F_0741.txt,dms.directory_211_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0742_benchmark,F_0742.txt,dms.directory_147_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0743_benchmark,F_0743.txt,dms.directory_384_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0744_benchmark,F_0744.txt,dms.directory_388_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0745_benchmark,F_0745.txt,dms.directory_122_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0746_benchmark,F_0746.txt,dms.directory_221_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0747_benchmark,F_0747.txt,dms.directory_073_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0748_benchmark,F_0748.txt,dms.directory_500_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0749_benchmark,F_0749.txt,dms.directory_244_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0750_benchmark,F_0750.txt,dms.directory_261_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0751_benchmark,F_0751.txt,dms.directory_233_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0752_benchmark,F_0752.txt,dms.directory_297_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0753_benchmark,F_0753.txt,dms.directory_024_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0754_benchmark,F_0754.txt,dms.directory_158_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0755_benchmark,F_0755.txt,dms.directory_128_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0756_benchmark,F_0756.txt,dms.directory_028_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0757_benchmark,F_0757.txt,dms.directory_196_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0758_benchmark,F_0758.txt,dms.directory_495_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0759_benchmark,F_0759.txt,dms.directory_420_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0760_benchmark,F_0760.txt,dms.directory_101_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0761_benchmark,F_0761.txt,dms.directory_474_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0762_benchmark,F_0762.txt,dms.directory_156_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0763_benchmark,F_0763.txt,dms.directory_028_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0764_benchmark,F_0764.txt,dms.directory_347_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0765_benchmark,F_0765.txt,dms.directory_267_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0766_benchmark,F_0766.txt,dms.directory_491_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0767_benchmark,F_0767.txt,dms.directory_379_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0768_benchmark,F_0768.txt,dms.directory_008_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0769_benchmark,F_0769.txt,dms.directory_161_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0770_benchmark,F_0770.txt,dms.directory_286_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0771_benchmark,F_0771.txt,dms.directory_164_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0772_benchmark,F_0772.txt,dms.directory_488_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0773_benchmark,F_0773.txt,dms.directory_398_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0774_benchmark,F_0774.txt,dms.directory_461_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0775_benchmark,F_0775.txt,dms.directory_385_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0776_benchmark,F_0776.txt,dms.directory_300_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0777_benchmark,F_0777.txt,dms.directory_225_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0778_benchmark,F_0778.txt,dms.directory_277_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0779_benchmark,F_0779.txt,dms.directory_122_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0780_benchmark,F_0780.txt,dms.directory_006_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0781_benchmark,F_0781.txt,dms.directory_044_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0782_benchmark,F_0782.txt,dms.directory_173_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0783_benchmark,F_0783.txt,dms.directory_499_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0784_benchmark,F_0784.txt,dms.directory_379_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0785_benchmark,F_0785.txt,dms.directory_467_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0786_benchmark,F_0786.txt,dms.directory_476_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0787_benchmark,F_0787.txt,dms.directory_170_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0788_benchmark,F_0788.txt,dms.directory_107_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0789_benchmark,F_0789.txt,dms.directory_267_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0790_benchmark,F_0790.txt,dms.directory_143_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0791_benchmark,F_0791.txt,dms.directory_146_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0792_benchmark,F_0792.txt,dms.directory_366_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0793_benchmark,F_0793.txt,dms.directory_492_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0794_benchmark,F_0794.txt,dms.directory_371_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0795_benchmark,F_0795.txt,dms.directory_084_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0796_benchmark,F_0796.txt,dms.directory_302_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0797_benchmark,F_0797.txt,dms.directory_487_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0798_benchmark,F_0798.txt,dms.directory_207_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0799_benchmark,F_0799.txt,dms.directory_338_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0800_benchmark,F_0800.txt,dms.directory_235_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0801_benchmark,F_0801.txt,dms.directory_243_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0802_benchmark,F_0802.txt,dms.directory_148_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0803_benchmark,F_0803.txt,dms.directory_412_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0804_benchmark,F_0804.txt,dms.directory_478_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0805_benchmark,F_0805.txt,dms.directory_345_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0806_benchmark,F_0806.txt,dms.directory_090_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0807_benchmark,F_0807.txt,dms.directory_453_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0808_benchmark,F_0808.txt,dms.directory_433_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0809_benchmark,F_0809.txt,dms.directory_229_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0810_benchmark,F_0810.txt,dms.directory_437_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0811_benchmark,F_0811.txt,dms.directory_284_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0812_benchmark,F_0812.txt,dms.directory_253_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0813_benchmark,F_0813.txt,dms.directory_237_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0814_benchmark,F_0814.txt,dms.directory_392_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0815_benchmark,F_0815.txt,dms.directory_481_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0816_benchmark,F_0816.txt,dms.directory_215_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0817_benchmark,F_0817.txt,dms.directory_356_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0818_benchmark,F_0818.txt,dms.directory_372_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0819_benchmark,F_0819.txt,dms.directory_491_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0820_benchmark,F_0820.txt,dms.directory_008_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0821_benchmark,F_0821.txt,dms.directory_267_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0822_benchmark,F_0822.txt,dms.directory_494_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0823_benchmark,F_0823.txt,dms.directory_336_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0824_benchmark,F_0824.txt,dms.directory_290_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0825_benchmark,F_0825.txt,dms.directory_282_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0826_benchmark,F_0826.txt,dms.directory_049_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0827_benchmark,F_0827.txt,dms.directory_245_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0828_benchmark,F_0828.txt,dms.directory_007_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0829_benchmark,F_0829.txt,dms.directory_295_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0830_benchmark,F_0830.txt,dms.directory_386_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0831_benchmark,F_0831.txt,dms.directory_400_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0832_benchmark,F_0832.txt,dms.directory_125_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0833_benchmark,F_0833.txt,dms.directory_231_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0834_benchmark,F_0834.txt,dms.directory_047_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0835_benchmark,F_0835.txt,dms.directory_143_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0836_benchmark,F_0836.txt,dms.directory_365_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0837_benchmark,F_0837.txt,dms.directory_393_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0838_benchmark,F_0838.txt,dms.directory_436_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0839_benchmark,F_0839.txt,dms.directory_432_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0840_benchmark,F_0840.txt,dms.directory_266_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0841_benchmark,F_0841.txt,dms.directory_360_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0842_benchmark,F_0842.txt,dms.directory_144_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0843_benchmark,F_0843.txt,dms.directory_413_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0844_benchmark,F_0844.txt,dms.directory_341_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0845_benchmark,F_0845.txt,dms.directory_198_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0846_benchmark,F_0846.txt,dms.directory_008_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0847_benchmark,F_0847.txt,dms.directory_427_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0848_benchmark,F_0848.txt,dms.directory_264_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0849_benchmark,F_0849.txt,dms.directory_373_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0850_benchmark,F_0850.txt,dms.directory_383_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0851_benchmark,F_0851.txt,dms.directory_091_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0852_benchmark,F_0852.txt,dms.directory_250_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0853_benchmark,F_0853.txt,dms.directory_220_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0854_benchmark,F_0854.txt,dms.directory_356_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0855_benchmark,F_0855.txt,dms.directory_279_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0856_benchmark,F_0856.txt,dms.directory_172_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0857_benchmark,F_0857.txt,dms.directory_009_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0858_benchmark,F_0858.txt,dms.directory_352_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0859_benchmark,F_0859.txt,dms.directory_245_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0860_benchmark,F_0860.txt,dms.directory_028_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0861_benchmark,F_0861.txt,dms.directory_079_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0862_benchmark,F_0862.txt,dms.directory_255_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0863_benchmark,F_0863.txt,dms.directory_364_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0864_benchmark,F_0864.txt,dms.directory_269_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0865_benchmark,F_0865.txt,dms.directory_134_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0866_benchmark,F_0866.txt,dms.directory_471_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0867_benchmark,F_0867.txt,dms.directory_295_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0868_benchmark,F_0868.txt,dms.directory_181_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0869_benchmark,F_0869.txt,dms.directory_087_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0870_benchmark,F_0870.txt,dms.directory_361_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0871_benchmark,F_0871.txt,dms.directory_403_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0872_benchmark,F_0872.txt,dms.directory_472_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0873_benchmark,F_0873.txt,dms.directory_380_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0874_benchmark,F_0874.txt,dms.directory_272_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0875_benchmark,F_0875.txt,dms.directory_464_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0876_benchmark,F_0876.txt,dms.directory_422_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0877_benchmark,F_0877.txt,dms.directory_197_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0878_benchmark,F_0878.txt,dms.directory_158_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0879_benchmark,F_0879.txt,dms.directory_041_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0880_benchmark,F_0880.txt,dms.directory_046_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0881_benchmark,F_0881.txt,dms.directory_458_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0882_benchmark,F_0882.txt,dms.directory_298_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0883_benchmark,F_0883.txt,dms.directory_288_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0884_benchmark,F_0884.txt,dms.directory_476_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0885_benchmark,F_0885.txt,dms.directory_177_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0886_benchmark,F_0886.txt,dms.directory_102_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0887_benchmark,F_0887.txt,dms.directory_058_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0888_benchmark,F_0888.txt,dms.directory_216_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0889_benchmark,F_0889.txt,dms.directory_403_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0890_benchmark,F_0890.txt,dms.directory_332_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0891_benchmark,F_0891.txt,dms.directory_346_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0892_benchmark,F_0892.txt,dms.directory_327_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0893_benchmark,F_0893.txt,dms.directory_104_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0894_benchmark,F_0894.txt,dms.directory_211_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0895_benchmark,F_0895.txt,dms.directory_087_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0896_benchmark,F_0896.txt,dms.directory_437_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0897_benchmark,F_0897.txt,dms.directory_347_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0898_benchmark,F_0898.txt,dms.directory_460_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0899_benchmark,F_0899.txt,dms.directory_191_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0900_benchmark,F_0900.txt,dms.directory_277_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0901_benchmark,F_0901.txt,dms.directory_035_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0902_benchmark,F_0902.txt,dms.directory_056_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0903_benchmark,F_0903.txt,dms.directory_433_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0904_benchmark,F_0904.txt,dms.directory_345_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0905_benchmark,F_0905.txt,dms.directory_486_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0906_benchmark,F_0906.txt,dms.directory_373_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0907_benchmark,F_0907.txt,dms.directory_288_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0908_benchmark,F_0908.txt,dms.directory_096_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0909_benchmark,F_0909.txt,dms.directory_077_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0910_benchmark,F_0910.txt,dms.directory_075_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0911_benchmark,F_0911.txt,dms.directory_473_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0912_benchmark,F_0912.txt,dms.directory_422_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0913_benchmark,F_0913.txt,dms.directory_208_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0914_benchmark,F_0914.txt,dms.directory_130_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0915_benchmark,F_0915.txt,dms.directory_455_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0916_benchmark,F_0916.txt,dms.directory_115_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0917_benchmark,F_0917.txt,dms.directory_358_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0918_benchmark,F_0918.txt,dms.directory_292_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0919_benchmark,F_0919.txt,dms.directory_292_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0920_benchmark,F_0920.txt,dms.directory_193_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0921_benchmark,F_0921.txt,dms.directory_179_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0922_benchmark,F_0922.txt,dms.directory_241_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0923_benchmark,F_0923.txt,dms.directory_400_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0924_benchmark,F_0924.txt,dms.directory_167_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0925_benchmark,F_0925.txt,dms.directory_300_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0926_benchmark,F_0926.txt,dms.directory_450_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0927_benchmark,F_0927.txt,dms.directory_395_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0928_benchmark,F_0928.txt,dms.directory_173_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0929_benchmark,F_0929.txt,dms.directory_148_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0930_benchmark,F_0930.txt,dms.directory_229_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0931_benchmark,F_0931.txt,dms.directory_453_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0932_benchmark,F_0932.txt,dms.directory_384_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0933_benchmark,F_0933.txt,dms.directory_378_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0934_benchmark,F_0934.txt,dms.directory_077_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0935_benchmark,F_0935.txt,dms.directory_309_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0936_benchmark,F_0936.txt,dms.directory_091_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0937_benchmark,F_0937.txt,dms.directory_332_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0938_benchmark,F_0938.txt,dms.directory_235_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0939_benchmark,F_0939.txt,dms.directory_428_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0940_benchmark,F_0940.txt,dms.directory_423_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0941_benchmark,F_0941.txt,dms.directory_417_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0942_benchmark,F_0942.txt,dms.directory_001_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0943_benchmark,F_0943.txt,dms.directory_445_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0944_benchmark,F_0944.txt,dms.directory_102_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0945_benchmark,F_0945.txt,dms.directory_049_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0946_benchmark,F_0946.txt,dms.directory_148_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0947_benchmark,F_0947.txt,dms.directory_039_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0948_benchmark,F_0948.txt,dms.directory_270_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0949_benchmark,F_0949.txt,dms.directory_138_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0950_benchmark,F_0950.txt,dms.directory_391_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0951_benchmark,F_0951.txt,dms.directory_428_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0952_benchmark,F_0952.txt,dms.directory_249_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0953_benchmark,F_0953.txt,dms.directory_225_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0954_benchmark,F_0954.txt,dms.directory_259_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0955_benchmark,F_0955.txt,dms.directory_304_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0956_benchmark,F_0956.txt,dms.directory_185_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0957_benchmark,F_0957.txt,dms.directory_272_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0958_benchmark,F_0958.txt,dms.directory_498_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0959_benchmark,F_0959.txt,dms.directory_062_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0960_benchmark,F_0960.txt,dms.directory_044_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0961_benchmark,F_0961.txt,dms.directory_454_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0962_benchmark,F_0962.txt,dms.directory_164_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0963_benchmark,F_0963.txt,dms.directory_268_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0964_benchmark,F_0964.txt,dms.directory_089_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0965_benchmark,F_0965.txt,dms.directory_214_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0966_benchmark,F_0966.txt,dms.directory_473_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0967_benchmark,F_0967.txt,dms.directory_195_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0968_benchmark,F_0968.txt,dms.directory_483_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0969_benchmark,F_0969.txt,dms.directory_007_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0970_benchmark,F_0970.txt,dms.directory_286_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0971_benchmark,F_0971.txt,dms.directory_078_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0972_benchmark,F_0972.txt,dms.directory_012_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0973_benchmark,F_0973.txt,dms.directory_229_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0974_benchmark,F_0974.txt,dms.directory_471_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0975_benchmark,F_0975.txt,dms.directory_460_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0976_benchmark,F_0976.txt,dms.directory_105_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0977_benchmark,F_0977.txt,dms.directory_483_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0978_benchmark,F_0978.txt,dms.directory_292_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0979_benchmark,F_0979.txt,dms.directory_344_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0980_benchmark,F_0980.txt,dms.directory_058_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0981_benchmark,F_0981.txt,dms.directory_463_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0982_benchmark,F_0982.txt,dms.directory_098_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0983_benchmark,F_0983.txt,dms.directory_291_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0984_benchmark,F_0984.txt,dms.directory_027_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0985_benchmark,F_0985.txt,dms.directory_460_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0986_benchmark,F_0986.txt,dms.directory_499_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0987_benchmark,F_0987.txt,dms.directory_395_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0988_benchmark,F_0988.txt,dms.directory_213_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0989_benchmark,F_0989.txt,dms.directory_006_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0990_benchmark,F_0990.txt,dms.directory_276_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0991_benchmark,F_0991.txt,dms.directory_287_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0992_benchmark,F_0992.txt,dms.directory_250_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0993_benchmark,F_0993.txt,dms.directory_059_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0994_benchmark,F_0994.txt,dms.directory_476_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0995_benchmark,F_0995.txt,dms.directory_156_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0996_benchmark,F_0996.txt,dms.directory_367_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0997_benchmark,F_0997.txt,dms.directory_125_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0998_benchmark,F_0998.txt,dms.directory_477_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_0999_benchmark,F_0999.txt,dms.directory_324_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1000_benchmark,F_1000.txt,dms.directory_447_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1001_benchmark,F_1001.txt,dms.directory_220_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1002_benchmark,F_1002.txt,dms.directory_286_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1003_benchmark,F_1003.txt,dms.directory_331_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1004_benchmark,F_1004.txt,dms.directory_010_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1005_benchmark,F_1005.txt,dms.directory_048_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1006_benchmark,F_1006.txt,dms.directory_495_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1007_benchmark,F_1007.txt,dms.directory_037_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1008_benchmark,F_1008.txt,dms.directory_495_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1009_benchmark,F_1009.txt,dms.directory_039_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1010_benchmark,F_1010.txt,dms.directory_082_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1011_benchmark,F_1011.txt,dms.directory_267_benchmark,,dms.tag_130_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1012_benchmark,F_1012.txt,dms.directory_356_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1013_benchmark,F_1013.txt,dms.directory_418_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1014_benchmark,F_1014.txt,dms.directory_271_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1015_benchmark,F_1015.txt,dms.directory_173_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1016_benchmark,F_1016.txt,dms.directory_347_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1017_benchmark,F_1017.txt,dms.directory_068_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1018_benchmark,F_1018.txt,dms.directory_476_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1019_benchmark,F_1019.txt,dms.directory_003_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1020_benchmark,F_1020.txt,dms.directory_272_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1021_benchmark,F_1021.txt,dms.directory_437_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1022_benchmark,F_1022.txt,dms.directory_271_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1023_benchmark,F_1023.txt,dms.directory_371_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1024_benchmark,F_1024.txt,dms.directory_374_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1025_benchmark,F_1025.txt,dms.directory_271_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1026_benchmark,F_1026.txt,dms.directory_415_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1027_benchmark,F_1027.txt,dms.directory_279_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1028_benchmark,F_1028.txt,dms.directory_440_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1029_benchmark,F_1029.txt,dms.directory_341_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1030_benchmark,F_1030.txt,dms.directory_263_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1031_benchmark,F_1031.txt,dms.directory_418_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1032_benchmark,F_1032.txt,dms.directory_444_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1033_benchmark,F_1033.txt,dms.directory_166_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1034_benchmark,F_1034.txt,dms.directory_442_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1035_benchmark,F_1035.txt,dms.directory_122_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1036_benchmark,F_1036.txt,dms.directory_092_benchmark,,dms.tag_070_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1037_benchmark,F_1037.txt,dms.directory_424_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1038_benchmark,F_1038.txt,dms.directory_482_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1039_benchmark,F_1039.txt,dms.directory_221_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1040_benchmark,F_1040.txt,dms.directory_388_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1041_benchmark,F_1041.txt,dms.directory_273_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1042_benchmark,F_1042.txt,dms.directory_015_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1043_benchmark,F_1043.txt,dms.directory_376_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1044_benchmark,F_1044.txt,dms.directory_087_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1045_benchmark,F_1045.txt,dms.directory_032_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1046_benchmark,F_1046.txt,dms.directory_405_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1047_benchmark,F_1047.txt,dms.directory_133_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1048_benchmark,F_1048.txt,dms.directory_485_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1049_benchmark,F_1049.txt,dms.directory_354_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1050_benchmark,F_1050.txt,dms.directory_145_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1051_benchmark,F_1051.txt,dms.directory_326_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1052_benchmark,F_1052.txt,dms.directory_042_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1053_benchmark,F_1053.txt,dms.directory_118_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1054_benchmark,F_1054.txt,dms.directory_330_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1055_benchmark,F_1055.txt,dms.directory_045_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1056_benchmark,F_1056.txt,dms.directory_394_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1057_benchmark,F_1057.txt,dms.directory_336_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1058_benchmark,F_1058.txt,dms.directory_043_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1059_benchmark,F_1059.txt,dms.directory_154_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1060_benchmark,F_1060.txt,dms.directory_294_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1061_benchmark,F_1061.txt,dms.directory_309_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1062_benchmark,F_1062.txt,dms.directory_350_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1063_benchmark,F_1063.txt,dms.directory_491_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1064_benchmark,F_1064.txt,dms.directory_349_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1065_benchmark,F_1065.txt,dms.directory_162_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1066_benchmark,F_1066.txt,dms.directory_486_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1067_benchmark,F_1067.txt,dms.directory_411_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1068_benchmark,F_1068.txt,dms.directory_489_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1069_benchmark,F_1069.txt,dms.directory_375_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1070_benchmark,F_1070.txt,dms.directory_392_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1071_benchmark,F_1071.txt,dms.directory_340_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1072_benchmark,F_1072.txt,dms.directory_026_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1073_benchmark,F_1073.txt,dms.directory_418_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1074_benchmark,F_1074.txt,dms.directory_035_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1075_benchmark,F_1075.txt,dms.directory_268_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1076_benchmark,F_1076.txt,dms.directory_308_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1077_benchmark,F_1077.txt,dms.directory_491_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1078_benchmark,F_1078.txt,dms.directory_188_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1079_benchmark,F_1079.txt,dms.directory_324_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1080_benchmark,F_1080.txt,dms.directory_170_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1081_benchmark,F_1081.txt,dms.directory_163_benchmark,,dms.tag_091_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1082_benchmark,F_1082.txt,dms.directory_327_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1083_benchmark,F_1083.txt,dms.directory_079_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1084_benchmark,F_1084.txt,dms.directory_052_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1085_benchmark,F_1085.txt,dms.directory_153_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1086_benchmark,F_1086.txt,dms.directory_299_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1087_benchmark,F_1087.txt,dms.directory_080_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1088_benchmark,F_1088.txt,dms.directory_158_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1089_benchmark,F_1089.txt,dms.directory_195_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1090_benchmark,F_1090.txt,dms.directory_164_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1091_benchmark,F_1091.txt,dms.directory_290_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1092_benchmark,F_1092.txt,dms.directory_072_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1093_benchmark,F_1093.txt,dms.directory_430_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1094_benchmark,F_1094.txt,dms.directory_180_benchmark,dms.category_041_benchmark,dms.tag_042_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1095_benchmark,F_1095.txt,dms.directory_297_benchmark,,dms.tag_004_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1096_benchmark,F_1096.txt,dms.directory_038_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1097_benchmark,F_1097.txt,dms.directory_245_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1098_benchmark,F_1098.txt,dms.directory_416_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1099_benchmark,F_1099.txt,dms.directory_242_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1100_benchmark,F_1100.txt,dms.directory_263_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1101_benchmark,F_1101.txt,dms.directory_196_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1102_benchmark,F_1102.txt,dms.directory_492_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1103_benchmark,F_1103.txt,dms.directory_301_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1104_benchmark,F_1104.txt,dms.directory_220_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1105_benchmark,F_1105.txt,dms.directory_304_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1106_benchmark,F_1106.txt,dms.directory_266_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1107_benchmark,F_1107.txt,dms.directory_179_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1108_benchmark,F_1108.txt,dms.directory_049_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1109_benchmark,F_1109.txt,dms.directory_365_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1110_benchmark,F_1110.txt,dms.directory_286_benchmark,,dms.tag_124_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1111_benchmark,F_1111.txt,dms.directory_141_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1112_benchmark,F_1112.txt,dms.directory_479_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1113_benchmark,F_1113.txt,dms.directory_484_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1114_benchmark,F_1114.txt,dms.directory_166_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1115_benchmark,F_1115.txt,dms.directory_336_benchmark,,dms.tag_075_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1116_benchmark,F_1116.txt,dms.directory_169_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1117_benchmark,F_1117.txt,dms.directory_174_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1118_benchmark,F_1118.txt,dms.directory_105_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1119_benchmark,F_1119.txt,dms.directory_131_benchmark,dms.category_049_benchmark,dms.tag_007_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1120_benchmark,F_1120.txt,dms.directory_234_benchmark,,dms.tag_137_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1121_benchmark,F_1121.txt,dms.directory_125_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1122_benchmark,F_1122.txt,dms.directory_258_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1123_benchmark,F_1123.txt,dms.directory_018_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1124_benchmark,F_1124.txt,dms.directory_007_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1125_benchmark,F_1125.txt,dms.directory_102_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1126_benchmark,F_1126.txt,dms.directory_239_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1127_benchmark,F_1127.txt,dms.directory_369_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1128_benchmark,F_1128.txt,dms.directory_115_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1129_benchmark,F_1129.txt,dms.directory_006_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1130_benchmark,F_1130.txt,dms.directory_483_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1131_benchmark,F_1131.txt,dms.directory_215_benchmark,dms.category_001_benchmark,dms.tag_102_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1132_benchmark,F_1132.txt,dms.directory_300_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1133_benchmark,F_1133.txt,dms.directory_410_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1134_benchmark,F_1134.txt,dms.directory_416_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1135_benchmark,F_1135.txt,dms.directory_476_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1136_benchmark,F_1136.txt,dms.directory_260_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1137_benchmark,F_1137.txt,dms.directory_411_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1138_benchmark,F_1138.txt,dms.directory_377_benchmark,dms.category_040_benchmark,dms.tag_043_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1139_benchmark,F_1139.txt,dms.directory_147_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1140_benchmark,F_1140.txt,dms.directory_312_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1141_benchmark,F_1141.txt,dms.directory_133_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1142_benchmark,F_1142.txt,dms.directory_045_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1143_benchmark,F_1143.txt,dms.directory_356_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1144_benchmark,F_1144.txt,dms.directory_009_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1145_benchmark,F_1145.txt,dms.directory_362_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1146_benchmark,F_1146.txt,dms.directory_323_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1147_benchmark,F_1147.txt,dms.directory_117_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1148_benchmark,F_1148.txt,dms.directory_353_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1149_benchmark,F_1149.txt,dms.directory_066_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1150_benchmark,F_1150.txt,dms.directory_068_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1151_benchmark,F_1151.txt,dms.directory_316_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1152_benchmark,F_1152.txt,dms.directory_368_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1153_benchmark,F_1153.txt,dms.directory_294_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1154_benchmark,F_1154.txt,dms.directory_065_benchmark,,dms.tag_034_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1155_benchmark,F_1155.txt,dms.directory_171_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1156_benchmark,F_1156.txt,dms.directory_149_benchmark,dms.category_009_benchmark,dms.tag_025_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1157_benchmark,F_1157.txt,dms.directory_396_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1158_benchmark,F_1158.txt,dms.directory_107_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1159_benchmark,F_1159.txt,dms.directory_380_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1160_benchmark,F_1160.txt,dms.directory_259_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1161_benchmark,F_1161.txt,dms.directory_391_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1162_benchmark,F_1162.txt,dms.directory_476_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1163_benchmark,F_1163.txt,dms.directory_053_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1164_benchmark,F_1164.txt,dms.directory_408_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1165_benchmark,F_1165.txt,dms.directory_450_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1166_benchmark,F_1166.txt,dms.directory_160_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1167_benchmark,F_1167.txt,dms.directory_415_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1168_benchmark,F_1168.txt,dms.directory_185_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1169_benchmark,F_1169.txt,dms.directory_281_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1170_benchmark,F_1170.txt,dms.directory_345_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1171_benchmark,F_1171.txt,dms.directory_357_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1172_benchmark,F_1172.txt,dms.directory_071_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1173_benchmark,F_1173.txt,dms.directory_016_benchmark,dms.category_033_benchmark,dms.tag_113_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1174_benchmark,F_1174.txt,dms.directory_246_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1175_benchmark,F_1175.txt,dms.directory_368_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1176_benchmark,F_1176.txt,dms.directory_154_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1177_benchmark,F_1177.txt,dms.directory_461_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1178_benchmark,F_1178.txt,dms.directory_170_benchmark,dms.category_019_benchmark,dms.tag_055_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1179_benchmark,F_1179.txt,dms.directory_039_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1180_benchmark,F_1180.txt,dms.directory_458_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1181_benchmark,F_1181.txt,dms.directory_286_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1182_benchmark,F_1182.txt,dms.directory_126_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1183_benchmark,F_1183.txt,dms.directory_160_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1184_benchmark,F_1184.txt,dms.directory_032_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1185_benchmark,F_1185.txt,dms.directory_202_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1186_benchmark,F_1186.txt,dms.directory_279_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1187_benchmark,F_1187.txt,dms.directory_040_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1188_benchmark,F_1188.txt,dms.directory_201_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1189_benchmark,F_1189.txt,dms.directory_127_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1190_benchmark,F_1190.txt,dms.directory_222_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1191_benchmark,F_1191.txt,dms.directory_233_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1192_benchmark,F_1192.txt,dms.directory_134_benchmark,dms.category_025_benchmark,dms.tag_074_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1193_benchmark,F_1193.txt,dms.directory_245_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1194_benchmark,F_1194.txt,dms.directory_221_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1195_benchmark,F_1195.txt,dms.directory_398_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1196_benchmark,F_1196.txt,dms.directory_172_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1197_benchmark,F_1197.txt,dms.directory_323_benchmark,dms.category_019_benchmark,dms.tag_105_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1198_benchmark,F_1198.txt,dms.directory_275_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1199_benchmark,F_1199.txt,dms.directory_365_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1200_benchmark,F_1200.txt,dms.directory_040_benchmark,dms.category_031_benchmark,dms.tag_116_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1201_benchmark,F_1201.txt,dms.directory_232_benchmark,dms.category_049_benchmark,dms.tag_093_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1202_benchmark,F_1202.txt,dms.directory_315_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1203_benchmark,F_1203.txt,dms.directory_033_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1204_benchmark,F_1204.txt,dms.directory_271_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1205_benchmark,F_1205.txt,dms.directory_262_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1206_benchmark,F_1206.txt,dms.directory_061_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1207_benchmark,F_1207.txt,dms.directory_185_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1208_benchmark,F_1208.txt,dms.directory_148_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1209_benchmark,F_1209.txt,dms.directory_395_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1210_benchmark,F_1210.txt,dms.directory_208_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1211_benchmark,F_1211.txt,dms.directory_173_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1212_benchmark,F_1212.txt,dms.directory_453_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1213_benchmark,F_1213.txt,dms.directory_063_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1214_benchmark,F_1214.txt,dms.directory_308_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1215_benchmark,F_1215.txt,dms.directory_015_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1216_benchmark,F_1216.txt,dms.directory_313_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1217_benchmark,F_1217.txt,dms.directory_268_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1218_benchmark,F_1218.txt,dms.directory_253_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1219_benchmark,F_1219.txt,dms.directory_378_benchmark,dms.category_034_benchmark,dms.tag_047_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1220_benchmark,F_1220.txt,dms.directory_278_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1221_benchmark,F_1221.txt,dms.directory_361_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1222_benchmark,F_1222.txt,dms.directory_234_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1223_benchmark,F_1223.txt,dms.directory_283_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1224_benchmark,F_1224.txt,dms.directory_126_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1225_benchmark,F_1225.txt,dms.directory_271_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1226_benchmark,F_1226.txt,dms.directory_354_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1227_benchmark,F_1227.txt,dms.directory_118_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1228_benchmark,F_1228.txt,dms.directory_325_benchmark,dms.category_012_benchmark,dms.tag_098_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1229_benchmark,F_1229.txt,dms.directory_250_benchmark,dms.category_006_benchmark,dms.tag_041_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1230_benchmark,F_1230.txt,dms.directory_159_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1231_benchmark,F_1231.txt,dms.directory_216_benchmark,,dms.tag_065_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1232_benchmark,F_1232.txt,dms.directory_168_benchmark,,dms.tag_119_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1233_benchmark,F_1233.txt,dms.directory_026_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1234_benchmark,F_1234.txt,dms.directory_436_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1235_benchmark,F_1235.txt,dms.directory_296_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1236_benchmark,F_1236.txt,dms.directory_113_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1237_benchmark,F_1237.txt,dms.directory_278_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1238_benchmark,F_1238.txt,dms.directory_070_benchmark,dms.category_021_benchmark,dms.tag_140_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1239_benchmark,F_1239.txt,dms.directory_058_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1240_benchmark,F_1240.txt,dms.directory_190_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1241_benchmark,F_1241.txt,dms.directory_204_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1242_benchmark,F_1242.txt,dms.directory_278_benchmark,,dms.tag_032_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1243_benchmark,F_1243.txt,dms.directory_478_benchmark,,dms.tag_127_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1244_benchmark,F_1244.txt,dms.directory_458_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1245_benchmark,F_1245.txt,dms.directory_140_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1246_benchmark,F_1246.txt,dms.directory_037_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1247_benchmark,F_1247.txt,dms.directory_411_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1248_benchmark,F_1248.txt,dms.directory_293_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1249_benchmark,F_1249.txt,dms.directory_077_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1250_benchmark,F_1250.txt,dms.directory_342_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1251_benchmark,F_1251.txt,dms.directory_310_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1252_benchmark,F_1252.txt,dms.directory_093_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1253_benchmark,F_1253.txt,dms.directory_337_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1254_benchmark,F_1254.txt,dms.directory_415_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1255_benchmark,F_1255.txt,dms.directory_223_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1256_benchmark,F_1256.txt,dms.directory_473_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1257_benchmark,F_1257.txt,dms.directory_382_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1258_benchmark,F_1258.txt,dms.directory_057_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1259_benchmark,F_1259.txt,dms.directory_450_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1260_benchmark,F_1260.txt,dms.directory_178_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1261_benchmark,F_1261.txt,dms.directory_476_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1262_benchmark,F_1262.txt,dms.directory_219_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1263_benchmark,F_1263.txt,dms.directory_345_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1264_benchmark,F_1264.txt,dms.directory_278_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1265_benchmark,F_1265.txt,dms.directory_001_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1266_benchmark,F_1266.txt,dms.directory_222_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1267_benchmark,F_1267.txt,dms.directory_120_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1268_benchmark,F_1268.txt,dms.directory_411_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1269_benchmark,F_1269.txt,dms.directory_386_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1270_benchmark,F_1270.txt,dms.directory_299_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1271_benchmark,F_1271.txt,dms.directory_335_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1272_benchmark,F_1272.txt,dms.directory_019_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1273_benchmark,F_1273.txt,dms.directory_055_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1274_benchmark,F_1274.txt,dms.directory_483_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1275_benchmark,F_1275.txt,dms.directory_033_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1276_benchmark,F_1276.txt,dms.directory_439_benchmark,dms.category_019_benchmark,dms.tag_081_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1277_benchmark,F_1277.txt,dms.directory_473_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1278_benchmark,F_1278.txt,dms.directory_397_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1279_benchmark,F_1279.txt,dms.directory_002_benchmark,,dms.tag_010_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1280_benchmark,F_1280.txt,dms.directory_382_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1281_benchmark,F_1281.txt,dms.directory_386_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1282_benchmark,F_1282.txt,dms.directory_387_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1283_benchmark,F_1283.txt,dms.directory_148_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1284_benchmark,F_1284.txt,dms.directory_414_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1285_benchmark,F_1285.txt,dms.directory_337_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1286_benchmark,F_1286.txt,dms.directory_005_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1287_benchmark,F_1287.txt,dms.directory_310_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1288_benchmark,F_1288.txt,dms.directory_204_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1289_benchmark,F_1289.txt,dms.directory_370_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1290_benchmark,F_1290.txt,dms.directory_216_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1291_benchmark,F_1291.txt,dms.directory_379_benchmark,,dms.tag_013_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1292_benchmark,F_1292.txt,dms.directory_187_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1293_benchmark,F_1293.txt,dms.directory_276_benchmark,dms.category_018_benchmark,dms.tag_083_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1294_benchmark,F_1294.txt,dms.directory_498_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1295_benchmark,F_1295.txt,dms.directory_287_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1296_benchmark,F_1296.txt,dms.directory_086_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1297_benchmark,F_1297.txt,dms.directory_324_benchmark,,dms.tag_012_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1298_benchmark,F_1298.txt,dms.directory_218_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1299_benchmark,F_1299.txt,dms.directory_097_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1300_benchmark,F_1300.txt,dms.directory_494_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1301_benchmark,F_1301.txt,dms.directory_274_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1302_benchmark,F_1302.txt,dms.directory_206_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1303_benchmark,F_1303.txt,dms.directory_251_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1304_benchmark,F_1304.txt,dms.directory_068_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1305_benchmark,F_1305.txt,dms.directory_313_benchmark,dms.category_040_benchmark,dms.tag_054_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1306_benchmark,F_1306.txt,dms.directory_099_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1307_benchmark,F_1307.txt,dms.directory_164_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1308_benchmark,F_1308.txt,dms.directory_194_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1309_benchmark,F_1309.txt,dms.directory_185_benchmark,dms.category_035_benchmark,dms.tag_101_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1310_benchmark,F_1310.txt,dms.directory_007_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1311_benchmark,F_1311.txt,dms.directory_337_benchmark,dms.category_003_benchmark,dms.tag_106_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1312_benchmark,F_1312.txt,dms.directory_276_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1313_benchmark,F_1313.txt,dms.directory_074_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1314_benchmark,F_1314.txt,dms.directory_305_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1315_benchmark,F_1315.txt,dms.directory_300_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1316_benchmark,F_1316.txt,dms.directory_358_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1317_benchmark,F_1317.txt,dms.directory_102_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1318_benchmark,F_1318.txt,dms.directory_018_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1319_benchmark,F_1319.txt,dms.directory_370_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1320_benchmark,F_1320.txt,dms.directory_408_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1321_benchmark,F_1321.txt,dms.directory_242_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1322_benchmark,F_1322.txt,dms.directory_243_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1323_benchmark,F_1323.txt,dms.directory_323_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1324_benchmark,F_1324.txt,dms.directory_011_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1325_benchmark,F_1325.txt,dms.directory_316_benchmark,dms.category_050_benchmark,dms.tag_050_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1326_benchmark,F_1326.txt,dms.directory_159_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1327_benchmark,F_1327.txt,dms.directory_135_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1328_benchmark,F_1328.txt,dms.directory_310_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1329_benchmark,F_1329.txt,dms.directory_413_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1330_benchmark,F_1330.txt,dms.directory_045_benchmark,dms.category_020_benchmark,dms.tag_141_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1331_benchmark,F_1331.txt,dms.directory_468_benchmark,,dms.tag_096_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1332_benchmark,F_1332.txt,dms.directory_033_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1333_benchmark,F_1333.txt,dms.directory_354_benchmark,dms.category_034_benchmark,dms.tag_033_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1334_benchmark,F_1334.txt,dms.directory_420_benchmark,dms.category_016_benchmark,dms.tag_147_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1335_benchmark,F_1335.txt,dms.directory_152_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1336_benchmark,F_1336.txt,dms.directory_319_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1337_benchmark,F_1337.txt,dms.directory_027_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1338_benchmark,F_1338.txt,dms.directory_241_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1339_benchmark,F_1339.txt,dms.directory_465_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1340_benchmark,F_1340.txt,dms.directory_146_benchmark,,dms.tag_060_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1341_benchmark,F_1341.txt,dms.directory_243_benchmark,dms.category_015_benchmark,dms.tag_089_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1342_benchmark,F_1342.txt,dms.directory_356_benchmark,dms.category_017_benchmark,dms.tag_017_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1343_benchmark,F_1343.txt,dms.directory_148_benchmark,,dms.tag_037_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1344_benchmark,F_1344.txt,dms.directory_145_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1345_benchmark,F_1345.txt,dms.directory_116_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1346_benchmark,F_1346.txt,dms.directory_454_benchmark,dms.category_007_benchmark,dms.tag_067_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1347_benchmark,F_1347.txt,dms.directory_298_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1348_benchmark,F_1348.txt,dms.directory_360_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1349_benchmark,F_1349.txt,dms.directory_239_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1350_benchmark,F_1350.txt,dms.directory_210_benchmark,dms.category_049_benchmark,dms.tag_040_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1351_benchmark,F_1351.txt,dms.directory_054_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1352_benchmark,F_1352.txt,dms.directory_448_benchmark,,dms.tag_094_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1353_benchmark,F_1353.txt,dms.directory_059_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1354_benchmark,F_1354.txt,dms.directory_327_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1355_benchmark,F_1355.txt,dms.directory_182_benchmark,,dms.tag_104_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1356_benchmark,F_1356.txt,dms.directory_294_benchmark,dms.category_024_benchmark,dms.tag_049_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1357_benchmark,F_1357.txt,dms.directory_460_benchmark,dms.category_050_benchmark,dms.tag_110_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1358_benchmark,F_1358.txt,dms.directory_389_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1359_benchmark,F_1359.txt,dms.directory_365_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1360_benchmark,F_1360.txt,dms.directory_373_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1361_benchmark,F_1361.txt,dms.directory_447_benchmark,,dms.tag_044_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1362_benchmark,F_1362.txt,dms.directory_398_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1363_benchmark,F_1363.txt,dms.directory_416_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1364_benchmark,F_1364.txt,dms.directory_037_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1365_benchmark,F_1365.txt,dms.directory_467_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1366_benchmark,F_1366.txt,dms.directory_467_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1367_benchmark,F_1367.txt,dms.directory_475_benchmark,dms.category_001_benchmark,dms.tag_099_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1368_benchmark,F_1368.txt,dms.directory_037_benchmark,,dms.tag_108_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1369_benchmark,F_1369.txt,dms.directory_070_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1370_benchmark,F_1370.txt,dms.directory_222_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1371_benchmark,F_1371.txt,dms.directory_105_benchmark,dms.category_022_benchmark,dms.tag_073_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1372_benchmark,F_1372.txt,dms.directory_018_benchmark,dms.category_004_benchmark,dms.tag_135_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1373_benchmark,F_1373.txt,dms.directory_334_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1374_benchmark,F_1374.txt,dms.directory_445_benchmark,dms.category_007_benchmark,dms.tag_118_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1375_benchmark,F_1375.txt,dms.directory_349_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1376_benchmark,F_1376.txt,dms.directory_171_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1377_benchmark,F_1377.txt,dms.directory_268_benchmark,dms.category_044_benchmark,dms.tag_095_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1378_benchmark,F_1378.txt,dms.directory_126_benchmark,dms.category_038_benchmark,dms.tag_092_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1379_benchmark,F_1379.txt,dms.directory_066_benchmark,dms.category_034_benchmark,dms.tag_109_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1380_benchmark,F_1380.txt,dms.directory_258_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1381_benchmark,F_1381.txt,dms.directory_245_benchmark,dms.category_003_benchmark,dms.tag_076_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1382_benchmark,F_1382.txt,dms.directory_299_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1383_benchmark,F_1383.txt,dms.directory_281_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1384_benchmark,F_1384.txt,dms.directory_071_benchmark,dms.category_039_benchmark,dms.tag_003_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1385_benchmark,F_1385.txt,dms.directory_196_benchmark,dms.category_050_benchmark,dms.tag_029_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1386_benchmark,F_1386.txt,dms.directory_447_benchmark,dms.category_003_benchmark,dms.tag_145_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1387_benchmark,F_1387.txt,dms.directory_432_benchmark,dms.category_015_benchmark,dms.tag_002_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1388_benchmark,F_1388.txt,dms.directory_281_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1389_benchmark,F_1389.txt,dms.directory_456_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1390_benchmark,F_1390.txt,dms.directory_132_benchmark,dms.category_013_benchmark,dms.tag_031_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1391_benchmark,F_1391.txt,dms.directory_120_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1392_benchmark,F_1392.txt,dms.directory_254_benchmark,dms.category_029_benchmark,dms.tag_005_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1393_benchmark,F_1393.txt,dms.directory_312_benchmark,dms.category_046_benchmark,dms.tag_022_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1394_benchmark,F_1394.txt,dms.directory_278_benchmark,dms.category_034_benchmark,dms.tag_142_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1395_benchmark,F_1395.txt,dms.directory_477_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1396_benchmark,F_1396.txt,dms.directory_131_benchmark,,dms.tag_132_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1397_benchmark,F_1397.txt,dms.directory_272_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1398_benchmark,F_1398.txt,dms.directory_257_benchmark,dms.category_014_benchmark,dms.tag_059_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1399_benchmark,F_1399.txt,dms.directory_468_benchmark,dms.category_015_benchmark,dms.tag_120_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1400_benchmark,F_1400.txt,dms.directory_102_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1401_benchmark,F_1401.txt,dms.directory_064_benchmark,dms.category_005_benchmark,dms.tag_014_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1402_benchmark,F_1402.txt,dms.directory_036_benchmark,dms.category_040_benchmark,dms.tag_072_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1403_benchmark,F_1403.txt,dms.directory_079_benchmark,dms.category_020_benchmark,dms.tag_129_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1404_benchmark,F_1404.txt,dms.directory_013_benchmark,dms.category_001_benchmark,dms.tag_122_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1405_benchmark,F_1405.txt,dms.directory_241_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1406_benchmark,F_1406.txt,dms.directory_452_benchmark,dms.category_039_benchmark,dms.tag_128_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1407_benchmark,F_1407.txt,dms.directory_374_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1408_benchmark,F_1408.txt,dms.directory_296_benchmark,dms.category_027_benchmark,dms.tag_001_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1409_benchmark,F_1409.txt,dms.directory_136_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1410_benchmark,F_1410.txt,dms.directory_475_benchmark,dms.category_025_benchmark,dms.tag_097_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1411_benchmark,F_1411.txt,dms.directory_071_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1412_benchmark,F_1412.txt,dms.directory_201_benchmark,dms.category_014_benchmark,dms.tag_149_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1413_benchmark,F_1413.txt,dms.directory_386_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1414_benchmark,F_1414.txt,dms.directory_407_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1415_benchmark,F_1415.txt,dms.directory_335_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1416_benchmark,F_1416.txt,dms.directory_310_benchmark,dms.category_039_benchmark,dms.tag_146_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1417_benchmark,F_1417.txt,dms.directory_313_benchmark,dms.category_023_benchmark,dms.tag_038_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1418_benchmark,F_1418.txt,dms.directory_180_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1419_benchmark,F_1419.txt,dms.directory_322_benchmark,dms.category_026_benchmark,dms.tag_027_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1420_benchmark,F_1420.txt,dms.directory_178_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1421_benchmark,F_1421.txt,dms.directory_467_benchmark,dms.category_014_benchmark,dms.tag_078_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1422_benchmark,F_1422.txt,dms.directory_321_benchmark,dms.category_022_benchmark,dms.tag_061_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1423_benchmark,F_1423.txt,dms.directory_489_benchmark,,dms.tag_006_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1424_benchmark,F_1424.txt,dms.directory_270_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1425_benchmark,F_1425.txt,dms.directory_228_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1426_benchmark,F_1426.txt,dms.directory_400_benchmark,dms.category_012_benchmark,dms.tag_023_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1427_benchmark,F_1427.txt,dms.directory_237_benchmark,dms.category_043_benchmark,dms.tag_079_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1428_benchmark,F_1428.txt,dms.directory_020_benchmark,dms.category_016_benchmark,dms.tag_100_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1429_benchmark,F_1429.txt,dms.directory_395_benchmark,dms.category_011_benchmark,dms.tag_021_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1430_benchmark,F_1430.txt,dms.directory_160_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1431_benchmark,F_1431.txt,dms.directory_372_benchmark,dms.category_011_benchmark,dms.tag_080_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1432_benchmark,F_1432.txt,dms.directory_200_benchmark,dms.category_001_benchmark,dms.tag_051_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1433_benchmark,F_1433.txt,dms.directory_122_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1434_benchmark,F_1434.txt,dms.directory_374_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1435_benchmark,F_1435.txt,dms.directory_173_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1436_benchmark,F_1436.txt,dms.directory_412_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1437_benchmark,F_1437.txt,dms.directory_204_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1438_benchmark,F_1438.txt,dms.directory_347_benchmark,dms.category_025_benchmark,dms.tag_112_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1439_benchmark,F_1439.txt,dms.directory_030_benchmark,dms.category_017_benchmark,dms.tag_011_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1440_benchmark,F_1440.txt,dms.directory_347_benchmark,,dms.tag_134_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1441_benchmark,F_1441.txt,dms.directory_103_benchmark,dms.category_037_benchmark,dms.tag_088_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1442_benchmark,F_1442.txt,dms.directory_295_benchmark,dms.category_021_benchmark,dms.tag_026_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1443_benchmark,F_1443.txt,dms.directory_381_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1444_benchmark,F_1444.txt,dms.directory_151_benchmark,dms.category_012_benchmark,dms.tag_057_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1445_benchmark,F_1445.txt,dms.directory_136_benchmark,dms.category_041_benchmark,dms.tag_087_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1446_benchmark,F_1446.txt,dms.directory_059_benchmark,,dms.tag_009_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1447_benchmark,F_1447.txt,dms.directory_216_benchmark,dms.category_043_benchmark,dms.tag_138_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1448_benchmark,F_1448.txt,dms.directory_182_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1449_benchmark,F_1449.txt,dms.directory_442_benchmark,,dms.tag_015_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1450_benchmark,F_1450.txt,dms.directory_258_benchmark,dms.category_025_benchmark,dms.tag_028_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1451_benchmark,F_1451.txt,dms.directory_272_benchmark,dms.category_032_benchmark,dms.tag_064_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1452_benchmark,F_1452.txt,dms.directory_326_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1453_benchmark,F_1453.txt,dms.directory_147_benchmark,dms.category_040_benchmark,dms.tag_024_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1454_benchmark,F_1454.txt,dms.directory_377_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1455_benchmark,F_1455.txt,dms.directory_464_benchmark,dms.category_046_benchmark,dms.tag_062_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1456_benchmark,F_1456.txt,dms.directory_425_benchmark,dms.category_028_benchmark,dms.tag_052_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1457_benchmark,F_1457.txt,dms.directory_361_benchmark,dms.category_043_benchmark,dms.tag_139_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1458_benchmark,F_1458.txt,dms.directory_394_benchmark,dms.category_033_benchmark,dms.tag_039_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1459_benchmark,F_1459.txt,dms.directory_133_benchmark,,dms.tag_046_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1460_benchmark,F_1460.txt,dms.directory_334_benchmark,,dms.tag_016_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1461_benchmark,F_1461.txt,dms.directory_341_benchmark,dms.category_050_benchmark,dms.tag_117_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1462_benchmark,F_1462.txt,dms.directory_179_benchmark,dms.category_027_benchmark,dms.tag_048_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1463_benchmark,F_1463.txt,dms.directory_352_benchmark,dms.category_021_benchmark,dms.tag_136_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1464_benchmark,F_1464.txt,dms.directory_231_benchmark,dms.category_040_benchmark,dms.tag_126_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1465_benchmark,F_1465.txt,dms.directory_226_benchmark,dms.category_008_benchmark,dms.tag_077_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1466_benchmark,F_1466.txt,dms.directory_216_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1467_benchmark,F_1467.txt,dms.directory_061_benchmark,dms.category_041_benchmark,dms.tag_115_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1468_benchmark,F_1468.txt,dms.directory_298_benchmark,dms.category_015_benchmark,dms.tag_056_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1469_benchmark,F_1469.txt,dms.directory_144_benchmark,dms.category_014_benchmark,dms.tag_103_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1470_benchmark,F_1470.txt,dms.directory_233_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1471_benchmark,F_1471.txt,dms.directory_325_benchmark,dms.category_023_benchmark,dms.tag_085_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1472_benchmark,F_1472.txt,dms.directory_394_benchmark,dms.category_049_benchmark,dms.tag_035_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1473_benchmark,F_1473.txt,dms.directory_362_benchmark,dms.category_019_benchmark,dms.tag_125_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1474_benchmark,F_1474.txt,dms.directory_363_benchmark,dms.category_018_benchmark,dms.tag_133_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1475_benchmark,F_1475.txt,dms.directory_131_benchmark,dms.category_011_benchmark,dms.tag_144_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1476_benchmark,F_1476.txt,dms.directory_478_benchmark,dms.category_018_benchmark,dms.tag_018_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1477_benchmark,F_1477.txt,dms.directory_184_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1478_benchmark,F_1478.txt,dms.directory_120_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1479_benchmark,F_1479.txt,dms.directory_139_benchmark,dms.category_031_benchmark,dms.tag_111_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1480_benchmark,F_1480.txt,dms.directory_042_benchmark,dms.category_013_benchmark,dms.tag_068_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1481_benchmark,F_1481.txt,dms.directory_296_benchmark,dms.category_041_benchmark,dms.tag_053_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1482_benchmark,F_1482.txt,dms.directory_043_benchmark,,dms.tag_123_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1483_benchmark,F_1483.txt,dms.directory_013_benchmark,,dms.tag_063_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1484_benchmark,F_1484.txt,dms.directory_025_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1485_benchmark,F_1485.txt,dms.directory_444_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1486_benchmark,F_1486.txt,dms.directory_085_benchmark,dms.category_024_benchmark,dms.tag_084_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1487_benchmark,F_1487.txt,dms.directory_427_benchmark,dms.category_014_benchmark,dms.tag_107_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1488_benchmark,F_1488.txt,dms.directory_136_benchmark,,dms.tag_090_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1489_benchmark,F_1489.txt,dms.directory_397_benchmark,dms.category_005_benchmark,dms.tag_058_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1490_benchmark,F_1490.txt,dms.directory_033_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1491_benchmark,F_1491.txt,dms.directory_130_benchmark,dms.category_022_benchmark,dms.tag_020_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1492_benchmark,F_1492.txt,dms.directory_247_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1493_benchmark,F_1493.txt,dms.directory_105_benchmark,dms.category_037_benchmark,dms.tag_030_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1494_benchmark,F_1494.txt,dms.directory_149_benchmark,dms.category_041_benchmark,dms.tag_036_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1495_benchmark,F_1495.txt,dms.directory_246_benchmark,dms.category_031_benchmark,dms.tag_114_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1496_benchmark,F_1496.txt,dms.directory_285_benchmark,dms.category_025_benchmark,dms.tag_082_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1497_benchmark,F_1497.txt,dms.directory_237_benchmark,dms.category_005_benchmark,dms.tag_121_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1498_benchmark,F_1498.txt,dms.directory_020_benchmark,,,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1499_benchmark,F_1499.txt,dms.directory_277_benchmark,,dms.tag_086_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== +dms.file_1500_benchmark,F_1500.txt,dms.directory_434_benchmark,dms.category_001_benchmark,dms.tag_143_benchmark,I2luY2x1ZGUgPHN0ZGlvLmg+DQoNCmludCBtYWluKHZvaWQpDQp7DQogICAgcHJpbnRmKCJoZWxsbywgd29ybGRcbiIpOw0KfQ== diff --git a/dms/tests/data/dms.storage.csv b/dms/tests/data/dms.storage.csv new file mode 100644 index 000000000..5db4c3e2d --- /dev/null +++ b/dms/tests/data/dms.storage.csv @@ -0,0 +1,3 @@ +id,name,save_type +dms.storage_001_benchmark,S_001,database +dms.storage_002_benchmark,S_002,database diff --git a/dms/tests/data/dms.tag.csv b/dms/tests/data/dms.tag.csv new file mode 100644 index 000000000..dc25364b5 --- /dev/null +++ b/dms/tests/data/dms.tag.csv @@ -0,0 +1,151 @@ +id,name,category_id/id +dms.tag_001_benchmark,T_001,dms.category_027_benchmark +dms.tag_002_benchmark,T_002,dms.category_015_benchmark +dms.tag_003_benchmark,T_003,dms.category_039_benchmark +dms.tag_004_benchmark,T_004, +dms.tag_005_benchmark,T_005,dms.category_029_benchmark +dms.tag_006_benchmark,T_006, +dms.tag_007_benchmark,T_007,dms.category_049_benchmark +dms.tag_008_benchmark,T_008,dms.category_015_benchmark +dms.tag_009_benchmark,T_009, +dms.tag_010_benchmark,T_010, +dms.tag_011_benchmark,T_011,dms.category_017_benchmark +dms.tag_012_benchmark,T_012, +dms.tag_013_benchmark,T_013, +dms.tag_014_benchmark,T_014,dms.category_005_benchmark +dms.tag_015_benchmark,T_015, +dms.tag_016_benchmark,T_016, +dms.tag_017_benchmark,T_017,dms.category_017_benchmark +dms.tag_018_benchmark,T_018,dms.category_018_benchmark +dms.tag_019_benchmark,T_019,dms.category_040_benchmark +dms.tag_020_benchmark,T_020,dms.category_022_benchmark +dms.tag_021_benchmark,T_021,dms.category_011_benchmark +dms.tag_022_benchmark,T_022,dms.category_046_benchmark +dms.tag_023_benchmark,T_023,dms.category_012_benchmark +dms.tag_024_benchmark,T_024,dms.category_040_benchmark +dms.tag_025_benchmark,T_025,dms.category_009_benchmark +dms.tag_026_benchmark,T_026,dms.category_021_benchmark +dms.tag_027_benchmark,T_027,dms.category_026_benchmark +dms.tag_028_benchmark,T_028,dms.category_025_benchmark +dms.tag_029_benchmark,T_029,dms.category_050_benchmark +dms.tag_030_benchmark,T_030,dms.category_037_benchmark +dms.tag_031_benchmark,T_031,dms.category_013_benchmark +dms.tag_032_benchmark,T_032, +dms.tag_033_benchmark,T_033,dms.category_034_benchmark +dms.tag_034_benchmark,T_034, +dms.tag_035_benchmark,T_035,dms.category_049_benchmark +dms.tag_036_benchmark,T_036,dms.category_041_benchmark +dms.tag_037_benchmark,T_037, +dms.tag_038_benchmark,T_038,dms.category_023_benchmark +dms.tag_039_benchmark,T_039,dms.category_033_benchmark +dms.tag_040_benchmark,T_040,dms.category_049_benchmark +dms.tag_041_benchmark,T_041,dms.category_006_benchmark +dms.tag_042_benchmark,T_042,dms.category_041_benchmark +dms.tag_043_benchmark,T_043,dms.category_040_benchmark +dms.tag_044_benchmark,T_044, +dms.tag_045_benchmark,T_045,dms.category_026_benchmark +dms.tag_046_benchmark,T_046, +dms.tag_047_benchmark,T_047,dms.category_034_benchmark +dms.tag_048_benchmark,T_048,dms.category_027_benchmark +dms.tag_049_benchmark,T_049,dms.category_024_benchmark +dms.tag_050_benchmark,T_050,dms.category_050_benchmark +dms.tag_051_benchmark,T_051,dms.category_001_benchmark +dms.tag_052_benchmark,T_052,dms.category_028_benchmark +dms.tag_053_benchmark,T_053,dms.category_041_benchmark +dms.tag_054_benchmark,T_054,dms.category_040_benchmark +dms.tag_055_benchmark,T_055,dms.category_019_benchmark +dms.tag_056_benchmark,T_056,dms.category_015_benchmark +dms.tag_057_benchmark,T_057,dms.category_012_benchmark +dms.tag_058_benchmark,T_058,dms.category_005_benchmark +dms.tag_059_benchmark,T_059,dms.category_014_benchmark +dms.tag_060_benchmark,T_060, +dms.tag_061_benchmark,T_061,dms.category_022_benchmark +dms.tag_062_benchmark,T_062,dms.category_046_benchmark +dms.tag_063_benchmark,T_063, +dms.tag_064_benchmark,T_064,dms.category_032_benchmark +dms.tag_065_benchmark,T_065, +dms.tag_066_benchmark,T_066,dms.category_017_benchmark +dms.tag_067_benchmark,T_067,dms.category_007_benchmark +dms.tag_068_benchmark,T_068,dms.category_013_benchmark +dms.tag_069_benchmark,T_069,dms.category_035_benchmark +dms.tag_070_benchmark,T_070, +dms.tag_071_benchmark,T_071,dms.category_049_benchmark +dms.tag_072_benchmark,T_072,dms.category_040_benchmark +dms.tag_073_benchmark,T_073,dms.category_022_benchmark +dms.tag_074_benchmark,T_074,dms.category_025_benchmark +dms.tag_075_benchmark,T_075, +dms.tag_076_benchmark,T_076,dms.category_003_benchmark +dms.tag_077_benchmark,T_077,dms.category_008_benchmark +dms.tag_078_benchmark,T_078,dms.category_014_benchmark +dms.tag_079_benchmark,T_079,dms.category_043_benchmark +dms.tag_080_benchmark,T_080,dms.category_011_benchmark +dms.tag_081_benchmark,T_081,dms.category_019_benchmark +dms.tag_082_benchmark,T_082,dms.category_025_benchmark +dms.tag_083_benchmark,T_083,dms.category_018_benchmark +dms.tag_084_benchmark,T_084,dms.category_024_benchmark +dms.tag_085_benchmark,T_085,dms.category_023_benchmark +dms.tag_086_benchmark,T_086, +dms.tag_087_benchmark,T_087,dms.category_041_benchmark +dms.tag_088_benchmark,T_088,dms.category_037_benchmark +dms.tag_089_benchmark,T_089,dms.category_015_benchmark +dms.tag_090_benchmark,T_090, +dms.tag_091_benchmark,T_091, +dms.tag_092_benchmark,T_092,dms.category_038_benchmark +dms.tag_093_benchmark,T_093,dms.category_049_benchmark +dms.tag_094_benchmark,T_094, +dms.tag_095_benchmark,T_095,dms.category_044_benchmark +dms.tag_096_benchmark,T_096, +dms.tag_097_benchmark,T_097,dms.category_025_benchmark +dms.tag_098_benchmark,T_098,dms.category_012_benchmark +dms.tag_099_benchmark,T_099,dms.category_001_benchmark +dms.tag_100_benchmark,T_100,dms.category_016_benchmark +dms.tag_101_benchmark,T_101,dms.category_035_benchmark +dms.tag_102_benchmark,T_102,dms.category_001_benchmark +dms.tag_103_benchmark,T_103,dms.category_014_benchmark +dms.tag_104_benchmark,T_104, +dms.tag_105_benchmark,T_105,dms.category_019_benchmark +dms.tag_106_benchmark,T_106,dms.category_003_benchmark +dms.tag_107_benchmark,T_107,dms.category_014_benchmark +dms.tag_108_benchmark,T_108, +dms.tag_109_benchmark,T_109,dms.category_034_benchmark +dms.tag_110_benchmark,T_110,dms.category_050_benchmark +dms.tag_111_benchmark,T_111,dms.category_031_benchmark +dms.tag_112_benchmark,T_112,dms.category_025_benchmark +dms.tag_113_benchmark,T_113,dms.category_033_benchmark +dms.tag_114_benchmark,T_114,dms.category_031_benchmark +dms.tag_115_benchmark,T_115,dms.category_041_benchmark +dms.tag_116_benchmark,T_116,dms.category_031_benchmark +dms.tag_117_benchmark,T_117,dms.category_050_benchmark +dms.tag_118_benchmark,T_118,dms.category_007_benchmark +dms.tag_119_benchmark,T_119, +dms.tag_120_benchmark,T_120,dms.category_015_benchmark +dms.tag_121_benchmark,T_121,dms.category_005_benchmark +dms.tag_122_benchmark,T_122,dms.category_001_benchmark +dms.tag_123_benchmark,T_123, +dms.tag_124_benchmark,T_124, +dms.tag_125_benchmark,T_125,dms.category_019_benchmark +dms.tag_126_benchmark,T_126,dms.category_040_benchmark +dms.tag_127_benchmark,T_127, +dms.tag_128_benchmark,T_128,dms.category_039_benchmark +dms.tag_129_benchmark,T_129,dms.category_020_benchmark +dms.tag_130_benchmark,T_130, +dms.tag_131_benchmark,T_131, +dms.tag_132_benchmark,T_132, +dms.tag_133_benchmark,T_133,dms.category_018_benchmark +dms.tag_134_benchmark,T_134, +dms.tag_135_benchmark,T_135,dms.category_004_benchmark +dms.tag_136_benchmark,T_136,dms.category_021_benchmark +dms.tag_137_benchmark,T_137, +dms.tag_138_benchmark,T_138,dms.category_043_benchmark +dms.tag_139_benchmark,T_139,dms.category_043_benchmark +dms.tag_140_benchmark,T_140,dms.category_021_benchmark +dms.tag_141_benchmark,T_141,dms.category_020_benchmark +dms.tag_142_benchmark,T_142,dms.category_034_benchmark +dms.tag_143_benchmark,T_143,dms.category_001_benchmark +dms.tag_144_benchmark,T_144,dms.category_011_benchmark +dms.tag_145_benchmark,T_145,dms.category_003_benchmark +dms.tag_146_benchmark,T_146,dms.category_039_benchmark +dms.tag_147_benchmark,T_147,dms.category_016_benchmark +dms.tag_148_benchmark,T_148,dms.category_040_benchmark +dms.tag_149_benchmark,T_149,dms.category_014_benchmark +dms.tag_150_benchmark,T_150,dms.category_013_benchmark diff --git a/dms/tests/data/mail01.eml b/dms/tests/data/mail01.eml new file mode 100644 index 000000000..2f4e8033c --- /dev/null +++ b/dms/tests/data/mail01.eml @@ -0,0 +1,170 @@ +Return-Path: <123@acm.org> +To: Manuel Lemos <directory+test@dmsTest.com> +Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message +From: mlemos <345@acm.org> +Reply-To: mlemos <456@acm.org> +Sender: mlemos@acm.org +X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" +Message-ID: <20050430192829.0489.mlemos@dmsTest.com> +Date: Sat, 30 Apr 2005 19:28:29 -0300 + + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: multipart/related; boundary="6a82fb459dcaacd40ab3404529e808dc" + + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: multipart/alternative; boundary="69c1683a3ee16ef7cf16edd700694a2f" + + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +This is an HTML message. Please use an HTML capable mail program to read +this message. + +--69c1683a3ee16ef7cf16edd700694a2f +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: quoted-printable + +<html> +<head> +<title>Testing Manuel Lemos' MIME E-mail composing and sending PHP class: H= +TML message + + + + + + + +
+

Testing Manuel Lemos' MIME E-mail composing and sending PHP cla= +ss: HTML message

+
+

Hello Manuel,

+This message is just to let you know that the MIME E-mail message composing and sending PHP class is working as expected.

+

Here is an image embedded in a message as a separate part:

= +
+
Than= +k you,
+mlemos

+
+ + +--69c1683a3ee16ef7cf16edd700694a2f-- + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="logo.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="logo.gif" +Content-ID: + +R0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v/////////////////// +/////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg +qLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto +RBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR +k5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p +m3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo +ZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT +Ol7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri +SSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX +JtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN +RlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV +z1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ +X8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws +YSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC +QwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/ +e1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI +osKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu +soeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV +4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj +VFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277 +7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw== + +--6a82fb459dcaacd40ab3404529e808dc +Content-Type: image/gif; name="background.gif" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="background.gif" +Content-ID: <4c837ed463ad29c820668e835a270e8a.gif> + +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 +eZmYmZmauZmc2ZlCEQEAOw== + +--6a82fb459dcaacd40ab3404529e808dc-- + +--652b8c4dcb00cdcdda1e16af36781caf +Content-Type: text/plain; name="attachment.txt" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="attachment.txt" + +VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu +dC50eHQgLg== + +--652b8c4dcb00cdcdda1e16af36781caf-- diff --git a/dms/tests/data/mail02.eml b/dms/tests/data/mail02.eml new file mode 100644 index 000000000..bb07b14f6 --- /dev/null +++ b/dms/tests/data/mail02.eml @@ -0,0 +1,44 @@ +MIME-Version: 1.0 +Received: by 10.220.191.194 with HTTP; Wed, 11 May 2011 12:27:12 -0700 (PDT) +Date: Wed, 11 May 2011 13:27:12 -0600 +Delivered-To: jncjkq@dmsTest.com +Message-ID: +Subject: Test +From: Bill Jncjkq +To: directory+test@dmsTest.com +Content-Type: multipart/mixed; boundary=bcaec54eecc63acce904a3050f79 + +--bcaec54eecc63acce904a3050f79 +Content-Type: multipart/alternative; boundary=bcaec54eecc63acce604a3050f77 + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/plain; charset=ISO-8859-1 + +-- +Bill Jncjkq + +--bcaec54eecc63acce604a3050f77 +Content-Type: text/html; charset=ISO-8859-1 + +
--
Bill Jncjkq
+ +--bcaec54eecc63acce604a3050f77-- +--bcaec54eecc63acce904a3050f79 +Content-Type: text/html; charset=US-ASCII; name="bookmarks-really-short.html" +Content-Disposition: attachment; filename="bookmarks-really-short.html" +Content-Transfer-Encoding: base64 +X-Attachment-Id: f_gnknv6u70 + +PCFET0NUWVBFIE5FVFNDQVBFLUJvb2ttYXJrLWZpbGUtMT4KCTxIVE1MPgoJPE1FVEEgSFRUUC1F +UVVJVj0iQ29udGVudC1UeXBlIiBDT05URU5UPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgoJ +PFRpdGxlPkJvb2ttYXJrczwvVGl0bGU+Cgk8SDE+Qm9va21hcmtzPC9IMT4KCQk8RFQ+PEgzIEZP +TERFRD5UZWNoIE5ld3M8L0gzPgoJCTxETD48cD4KCQkJPERUPjxBIEhSRUY9Imh0dHA6Ly93d3cu +Y25ldC5jb20vIj5DTmV0PC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53aXJlZC5jb20v +Ij5XaXJlZCBOZXdzPC9BPgoJCTwvREw+PHA+CgkJPERUPjxIMyBGT0xERUQ+VG9vbHMgYW5kIFJl +ZmVyZW5jZTwvSDM+CgkJPERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy5tb25zdGVy +LmNvbS8iPk1vbnN0ZXIuY29tPC9BPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL3d3dy53ZWJtZC5j +b20vIj5XZWJNRDwvQT4KCQk8L0RMPjxwPgoJCTxEVD48SDMgRk9MREVEPlRyYXZlbDwvSDM+CgkJ +PERMPjxwPgoJCQk8RFQ+PEEgSFJFRj0iaHR0cDovL2ZvZG9ycy5jb20vIj5Gb2RvcnM8L0E+CgkJ +CTxEVD48QSBIUkVGPSJodHRwOi8vd3d3LnRyYXZlbG9jaXR5LmNvbS8iPlRyYXZlbG9jaXR5PC9B +PgoJCTwvREw+PHA+Cgk8L0RMPjxwPgo8L0hUTUw+ +--bcaec54eecc63acce904a3050f79-- diff --git a/dms/tests/test_benchmark.py b/dms/tests/test_benchmark.py new file mode 100644 index 000000000..1a85e4ed6 --- /dev/null +++ b/dms/tests/test_benchmark.py @@ -0,0 +1,391 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import cProfile +import logging +import os +import unittest +import warnings +from functools import wraps + +from odoo.tests import common, tagged +from odoo.tools import convert_file + +from .common import track_function + +_logger = logging.getLogger(__name__) + + +class profile: + def __init__(self, fname=None): + warnings.warn("Since 16.0.", DeprecationWarning, stacklevel=2) + self.fname = fname + + def __call__(self, f): + @wraps(f) + def wrapper(*args, **kwargs): + profile = cProfile.Profile() + result = profile.runcall(f, *args, **kwargs) + profile.dump_stats(self.fname or (f"{f.__name__}.cprof")) + return result + + return wrapper + + +# This tests will only be executed if --test-tags benchmark is defined +@tagged("-standard", "benchmark") +class BenchmarkTestCase(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls._clean_existing_records() + cls._setup_benchmark_data() + + @classmethod + def _clean_existing_records(cls): + cls.env["dms.category"].search([]).sudo().unlink() + cls.env["dms.directory"].search([]).sudo().unlink() + cls.env["dms.storage"].search([]).sudo().unlink() + cls.env["dms.tag"].search([]).sudo().unlink() + + @classmethod + def _load(cls, module, *args): + path = str(os.path.join(module, *args)) + convert_file(cls.env, "dms", args[-1], {}, "init", False, "test", path) + + @classmethod + def _setup_benchmark_data(cls): + cls._load("dms", "tests", "data", "dms.category.csv") + cls._load("dms", "tests", "data", "dms.storage.csv") + cls._load("dms", "tests", "data", "dms.tag.csv") + cls._load("dms", "tests", "data", "dms.directory.csv") + cls._load("dms", "tests", "data", "dms.file.csv") + + def _benchmark_table(self, data): + columns = len(data[0]) - 1 + formt = "{:7}" + "| {:28}" * columns + + result = formt.format(*data[0]) + "\n" + result += ("-" * 7) + (("+" + "-" * 29) * columns) + "\n" + for row in data[1:]: + result += formt.format(*row) + "\n" + return result + + def _benchmark_function(self, func, args_list): + tfunc = track_function(return_tracking=True)(func) + benchmark = [] + for item in args_list: + self.registry.clear_all_caches() + args = item[0] if len(item) > 0 else [] + kwargs = item[1] if len(item) > 1 else {} + tracking = tuple(tfunc(*args, **kwargs)[1][1:]) + # pylint: disable=too-few-format-args + # pyupgrade: disable=UP030 + benchmark.append("{}sq {:.3f}s {:.3f}s {:.3f}s".format(*tracking)) + return benchmark + + # ---------------------------------------------------------- + # File + # ---------------------------------------------------------- + + def _file_kanban_fields(self): + return [ + "id", + "tag_ids", + "name", + "color", + "active", + "mimetype", + "create_uid", + "write_date", + "locked_by", + "is_locked", + "is_lock_editor", + "permission_write", + "permission_unlink", + ] + + def test_file_search_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + args = [ + [[[]], {"limit": 1}], + [[[]], {"limit": 80}], + [[[]], {"limit": 500}], + [[[]]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search, args + ) + + info_message = "\n\nSearching files with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_search_read_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + args = [[[], {"limit": 1}], [[], {"limit": 80}], [[], {"limit": 500}], [[]]] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search_read, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search_read, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search_read, args + ) + + info_message = "\n\nSearching and reading all fields with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_search_name_get_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + + def test_function(model, limit): + return model.search([], limit=limit).mapped("display_name") + + model_super = model.sudo() + model_admin = model.with_user(admin_uid) + model_demo = model.with_user(demo_uid) + args_super = [ + [[model_super, 1]], + [[model_super, 800]], + [[model_super, 500]], + [[model_super, None]], + ] + args_admin = [ + [[model_admin, 1]], + [[model_admin, 800]], + [[model_admin, 500]], + [[model_admin, None]], + ] + args_demo = [ + [[model_demo, 1]], + [[model_demo, 800]], + [[model_demo, 500]], + [[model_demo, None]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + test_function, args_super + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + test_function, args_admin + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + test_function, args_demo + ) + + info_message = ( + "\n\nSearching and 'display_name' function with bin_size = True | " + ) + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_file_kanban_backend_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_context(bin_size=True) + kanban_fields = self._file_kanban_fields() + + def test_function(model, kanban_fields, limit=80): + model.search_panel_select_range("directory_id") + model.search_panel_select_multi_range("directory_id") + model.search_panel_select_multi_range("tag_ids") + model.search_read(fields=kanban_fields, limit=limit) + + def function_args(args, kwargs): + return [[args, {"limit": arg}] for arg in kwargs] + + args_super = function_args([model.sudo(), kanban_fields], [1, 80, 500, None]) + args_admin = function_args( + [model.with_user(admin_uid), kanban_fields], [1, 80, 500, None] + ) + args_demo = function_args( + [model.with_user(demo_uid), kanban_fields], [1, 80, 500, None] + ) + + benchmark_data_super = ["Super"] + self._benchmark_function( + test_function, args_super + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + test_function, args_admin + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + test_function, args_demo + ) + + info_message = "\n\nSimulate kanban view loading on the backend | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time || " + info_message += "500 Directories | 150 Tags | 50 Categories\n" + _logger.info(info_message) + + # ---------------------------------------------------------- + # Directory + # ---------------------------------------------------------- + + def test_directory_search_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.directory"].with_context(bin_size=True) + args = [ + [[[]], {"limit": 1}], + [[[]], {"limit": 80}], + [[[]], {"limit": 500}], + [[[]]], + ] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search, args + ) + + info_message = "\n\nSearching directories with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + def test_directory_search_read_benchmark(self): + demo_uid = self.browse_ref("base.user_demo").id + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.directory"].with_context(bin_size=True) + args = [[[], {"limit": 1}], [[], {"limit": 80}], [[], {"limit": 500}], [[]]] + + benchmark_data_super = ["Super"] + self._benchmark_function( + model.sudo().search_read, args + ) + benchmark_data_admin = ["Admin"] + self._benchmark_function( + model.with_user(admin_uid).search_read, args + ) + benchmark_data_demo = ["Demo"] + self._benchmark_function( + model.with_user(demo_uid).search_read, args + ) + + info_message = "\n\nSearching and reading all fields with bin_size = True | " + info_message += "Benchmark with Limit 1 / 80 / 500 / None (1500)\n\n" + info_message += self._benchmark_table( + [ + [ + "User", + "Search Limit 1", + "Search Limit 80", + "Search Limit 500", + "Search No Limit", + ], + benchmark_data_super, + benchmark_data_admin, + benchmark_data_demo, + ] + ) + info_message += "\nLegend: Queries | Query Time | Server Time | Total Time\n" + _logger.info(info_message) + + # ---------------------------------------------------------- + # Profiler + # ---------------------------------------------------------- + + @unittest.skip("Takes to long to be tested every time.") + def test_file_search_read_profile_admin(self): + @track_function() + @profile(minimum_queries=35) + def profile_function(model): + model.search_read([]) + + admin_uid = self.browse_ref("base.user_admin").id + model = self.env["dms.file"].with_user(admin_uid) + profile_function(model.with_context(bin_size=True)) diff --git a/dms/tests/test_directory.py b/dms/tests/test_directory.py new file mode 100644 index 000000000..f7e81eb18 --- /dev/null +++ b/dms/tests/test_directory.py @@ -0,0 +1,319 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import os + +from odoo import Command +from odoo.exceptions import AccessError, UserError +from odoo.tests import new_test_user +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + +_path = os.path.dirname(os.path.dirname(__file__)) + + +class DirectoryTestCaseBase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.subdirectory = cls.create_directory(directory=cls.directory) + cls.file.directory_id = cls.subdirectory + cls.new_storage = cls.create_storage(save_type="database") + + @users("dms-manager", "dms-user") + def test_create_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + self.assertEqual( + sub_directory.storage_id.id, + self.storage.id, + msg="The storage of the subdirectory should be the same as " + "the root directory", + ) + self.assertEqual( + root_directory.count_directories, + 1, + msg="The root directory should have one subdirectory", + ) + + @users("dms-manager", "dms-user") + def test_copy_root_directory(self): + copy_root_directory = self.directory.copy() + copy_root_directory.flush_recordset() + self.assertEqual( + self.directory.storage_id.id, + copy_root_directory.storage_id.id, + msg="The storage of the copied root directory should be the same as the " + "original root directory", + ) + self.assertEqual( + self.directory.count_directories, + copy_root_directory.count_directories, + msg="The copied root directory should have the same number of " + "subdirectories as the original root directory", + ) + self.assertEqual( + self.directory.count_files, + copy_root_directory.count_files, + msg="The copied root directory should have the same number of " + "files as the original root directory", + ) + + @users("dms-manager", "dms-user") + def test_copy_sub_directory(self): + copy_sub_directory = self.subdirectory.copy() + self.assertEqual( + self.subdirectory.storage_id.id, + copy_sub_directory.storage_id.id, + msg="The storage of the copied subdirectory should be the same as the " + "original subdirectory", + ) + self.assertEqual( + self.subdirectory.count_directories, + copy_sub_directory.count_directories, + msg="The copied subdirectory should have the same number of subdirectories " + "as the original subdirectory", + ) + self.assertEqual( + self.subdirectory.count_files, + copy_sub_directory.count_files, + msg="The copied subdirectory should have the same number of " + "files as the original subdirectory", + ) + + @users("dms-manager", "dms-user") + def test_rename_directory(self): + path_names = self.subdirectory.complete_name + self.directory.write({"name": f"New Test Name {self.env.user.login}"}) + self.assertNotEqual( + path_names, + self.subdirectory.complete_name, + msg="The path name of the subdirectory should have changed", + ) + + @users("dms-manager", "dms-user") + def test_move_directory(self): + with self.assertRaises(UserError, msg="The root directory should not be moved"): + self.directory.write( + { + "is_root_directory": False, + "parent_id": self.subdirectory.id, + } + ) + with self.assertRaises( + UserError, msg="The subdirectory storage should not be changed" + ): + self.subdirectory.write( + { + "is_root_directory": True, + "storage_id": self.new_storage.id, + "parent_id": False, + } + ) + self.subdirectory.write( + { + "is_root_directory": True, + "storage_id": self.storage.id, + "parent_id": False, + } + ) + new_directory = self.create_directory(storage=self.storage) + self.subdirectory.write( + { + "is_root_directory": False, + "storage_id": False, + "parent_id": new_directory.id, + } + ) + with self.assertRaises(UserError, msg="The root directory should not be moved"): + self.directory.storage_id = self.new_storage.id + self.subdirectory.write( + { + "is_root_directory": False, + "storage_id": False, + "parent_id": self.directory.id, + } + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_root_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + sub_files = self.create_file(directory=sub_directory) + root_directory.unlink() + self.assertFalse( + sub_directory.exists(), msg="The subdirectory should not exist anymore" + ) + self.assertFalse( + sub_files.exists(), msg="The subfiles should not exist anymore" + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_directory(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + sub_files = self.create_file(directory=sub_directory) + sub_directory.unlink() + self.assertTrue( + root_directory.exists(), msg="The root directory should still exist" + ) + self.assertFalse( + sub_files.exists(), msg="The subfiles should not exist anymore" + ) + + @users("dms-manager", "dms-user") + def test_storage(self): + root_directory = self.create_directory(storage=self.storage) + sub_directory = self.create_directory(directory=root_directory) + self.assertEqual( + sub_directory.storage_id.id, + self.storage.id, + msg="The storage " + "of the subdirectory should be the same as the root " + "directory", + ) + with self.assertRaises( + UserError, msg="The storage of the root directory should " "not be changed" + ): + root_directory.write({"storage_id": self.new_storage.id}) + + @users("dms-manager", "dms-user") + def test_starred(self): + self.directory.toggle_starred() + self.subdirectory.write({"starred": True}) + starred = self.directory_model.search([("starred", "=", True)]) + self.assertIn( + self.directory.id, starred.ids, msg="The directory should be starred" + ) + self.assertIn( + self.subdirectory.id, starred.ids, msg="The subdirectory should be starred" + ) + + @users("dms-manager", "dms-user") + def test_count_directories(self): + self.assertTrue( + self.directory.count_directories, + msg="The directory should have subdirectories", + ) + + @users("dms-manager", "dms-user") + def test_count_files(self): + self.assertTrue( + self.subdirectory.count_files, msg="The subdirectory should have files" + ) + + @users("dms-manager", "dms-user") + def test_count_elements(self): + self.assertTrue( + self.directory.count_elements, + msg="The directory should have subdirectories and files", + ) + + @users("dms-manager", "dms-user") + def test_count_total_directories(self): + self.assertTrue( + self.directory.count_total_directories, + msg="The directory should have subdirectories", + ) + + @users("dms-manager", "dms-user") + def test_count_count_total_files(self): + self.assertTrue( + self.directory.count_total_files, msg="The directory should have files" + ) + + @users("dms-manager", "dms-user") + def test_count_total_elements(self): + self.assertTrue( + self.directory.count_total_elements, + msg="The directory should have subdirectories and files", + ) + + @users("dms-manager", "dms-user") + def test_size(self): + self.assertTrue(self.directory.size, msg="The directory should have a size") + + @users("dms-manager", "dms-user") + def test_name_get(self): + directory = self.subdirectory.with_context(dms_directory_show_path=True) + self.assertTrue( + "/" in directory.with_context(dms_directory_show_path=True).display_name, + msg="The path should be displayed in the directory name", + ) + + @users("dms-manager", "dms-user") + def test_name_search(self): + directories = self.directory_model.name_search("/") + self.assertTrue(len(directories), msg="The root directory should be found") + + @users("dms-manager", "dms-user") + def test_search_panel(self): + self.assertTrue( + self.directory_model.search_panel_select_multi_range("parent_id"), + msg="The parent_id field should be a multi range field", + ) + self.assertTrue( + self.directory_model.search_panel_select_multi_range("category_id"), + msg="The category_id field should be a multi range field", + ) + self.assertTrue( + self.directory_model.search_panel_select_multi_range("tag_ids"), + msg="The tag_ids field should be a multi range field", + ) + + def test_directory_unlink_custom(self): + user = new_test_user( + self.env, login="test-dms-customer-user", groups="dms.group_dms_user" + ) + group = self.access_group_model.create( + {"name": "Test read group", "explicit_user_ids": [Command.set(user.ids)]} + ) + root_directory = self.create_directory(storage=self.storage) + root_directory.group_ids = [Command.link(group.id)] + with self.assertRaises(AccessError): + root_directory.with_user(user).unlink() + + +class DirectoryMailTestCase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.params = cls.env["ir.config_parameter"].sudo() + cls.params.set_param("mail.catchall.domain", "dmstest.com") + cls.domain = cls.env["mail.alias.domain"].create({"name": "dmstest.com"}) + cls.alias = cls.env["mail.alias"].create( + { + "alias_model_id": cls.env["ir.model"] + .search([("model", "=", "dms.directory")]) + .id, + "alias_domain_id": cls.domain.id, + } + ) + + @mute_logger("odoo.addons.mail.mail_thread") + def test_mail_alias_files(self): + self.directory.write({"alias_process": "files", "alias_name": "directory+test"}) + self._handle_mail_reception() + + def _handle_mail_reception(self): + with open(os.path.join(_path, "tests", "data", "mail01.eml")) as file: + self.env["mail.thread"].message_process(None, file.read()) + with open(os.path.join(_path, "tests", "data", "mail02.eml")) as file: + self.env["mail.thread"].message_process(None, file.read()) + + @mute_logger("odoo.addons.mail.mail_thread") + def test_mail_alias_directory(self): + self.directory.write( + {"alias_process": "directory", "alias_name": "directory+test"} + ) + self.assertEqual( + self.directory.alias_id.display_name, + f"{self.directory.alias_name}@{self.domain.name}", + ) diff --git a/dms/tests/test_file.py b/dms/tests/test_file.py new file mode 100644 index 000000000..f67aa4ec9 --- /dev/null +++ b/dms/tests/test_file.py @@ -0,0 +1,193 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import base64 + +from odoo.exceptions import UserError +from odoo.tests import new_test_user +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageFileBaseCase + +try: + import magic +except ImportError: + magic = None + + +class FileFilestoreTestCase(StorageFileBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_a = new_test_user(cls.env, login="user-a", groups="dms.group_dms_user") + cls.directory_group_a = cls.create_directory(storage=cls.storage) + cls.inaccessible_directory = cls.create_directory(storage=cls.storage) + cls.inaccessible_file = cls.create_file(directory=cls.inaccessible_directory) + cls.inaccessible_group = cls.access_group_model.create( + { + "name": "Inaccessible Group. No directory set", + "perm_create": True, + "explicit_user_ids": [(6, 0, [cls.user_a.id])], + } + ) + cls.sub_directory_x = cls.create_directory(directory=cls.directory_group_a) + cls.group_a = cls.access_group_model.create( + { + "name": "Group A", + "perm_create": True, + "explicit_user_ids": [(6, 0, [cls.user_a.id])], + "directory_ids": [ + (4, cls.directory_group_a.id), + (4, cls.sub_directory_x.id), + ], + } + ) + cls.directory_group_a.group_ids = [(4, cls.group_a.id)] + cls.file2 = cls.create_file(directory=cls.sub_directory_x) + + @users("user-a") + def test_unaccessible_file(self): + dms_files = self.file_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.inaccessible_file.id, + dms_files.ids, + msg="User A should not see the unaccessible file since it " + "was not granted access to the directory", + ) + self.assertIn( + self.file2.id, + dms_files.ids, + msg="User A should see the file2 since it was granted access to " + "the directory", + ) + + @users("user-a") + def test_inaccessible_directory(self): + dms_directories = self.directory_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.inaccessible_directory.id, + dms_directories.ids, + msg="User A should not see the inaccessible directory since " + "it was not granted access to the directory", + ) + self.assertIn( + self.sub_directory_x.id, + dms_directories.ids, + msg="User A should see the sub_directory_x since it was granted " + "access to the directory", + ) + + @users("user-a") + def test_file_access(self): + dms_files = self.file_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn(self.file.id, dms_files.ids, msg="User A should not see file") + self.assertIn(self.file2.id, dms_files.ids, msg="User A should see file2") + dms_directories = self.directory_model.with_user(self.env.user).search( + [("storage_id", "=", self.storage.id)] + ) + self.assertNotIn( + self.directory.id, + dms_directories.ids, + msg="User A should not see directory", + ) + self.assertIn( + self.sub_directory_x.id, + dms_directories.ids, + msg="User A should see sub_directory_x", + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_content_file(self): + object_file = self.create_file(directory=self.directory) + self.assertTrue(object_file.content, msg="Content is not empty") + self.assertTrue(object_file.content_file, msg="Content file is not empty") + self.assertTrue( + object_file.with_context(bin_size=True).content, + msg="Content is not empty (with bin_size)", + ) + self.assertTrue( + object_file.with_context(bin_size=True).content_file, + msg="Content file is not empty (with bin_size)", + ) + self.assertTrue( + object_file.with_context(human_size=True).content_file, + msg="Content file is not empty (with human_size)", + ) + self.assertTrue( + object_file.with_context(base64=True).content_file, + msg="Content file is not empty (with base64)", + ) + self.assertTrue( + object_file.with_context(stream=True).content_file, + msg="Content file is not empty (with stream)", + ) + oid = object_file.with_context(oid=True).content_file + self.assertTrue(oid, msg="Content file is not empty (with oid)") + object_file.with_context(**{"show_content": True}).write( + {"content": base64.b64encode(b"\xff new content")} + ) + self.assertNotEqual( + oid, + object_file.with_context(**{"oid": True}).content_file, + msg="Content file has changed", + ) + self.assertTrue(object_file.export_data(["content"])) + object_file.unlink() + + def test_content_file_mimetype(self): + file_svg = self.env.ref("dms.file_05_demo") + self.assertEqual(file_svg.mimetype, "image/svg+xml", msg="SVG mimetype") + file_logo = self.env.ref("dms.file_02_demo") + self.assertEqual(file_logo.mimetype, "image/jpeg", msg="JPEG mimetype") + + def test_content_file_mimetype_magic_library(self): + if not magic: + self.skipTest("Without python-magic library installed") + file_video = self.env.ref("dms.file_10_demo") + self.assertEqual(file_video.mimetype, "video/mp4", msg="MP4 mimetype") + + def test_content_file_extension(self): + file_pdf = self.env.ref("dms.file_27_demo") + self.assertEqual(file_pdf.extension, "pdf", msg="PDF extension") + file_pdf.name = "Document_05" + self.assertEqual( + file_pdf.extension, "pdf", msg="PDF extension without extension" + ) + file_pdf.name = "Document_05.pdf" + self.assertEqual(file_pdf.extension, "pdf", msg="PDF extension with extension") + + def test_wizard_dms_file_move(self): + file3 = self.create_file(directory=self.sub_directory_x) + all_files = self.file + self.file2 + file3 + # Error: All files must have the same root directory + with self.assertRaises( + UserError, msg="All files must have the same root directory" + ): + self.file_model.with_context( + active_ids=all_files.ids + ).action_wizard_dms_file_move() + # Change the files that have the same root directory + files = self.file2 + file3 + res = self.file_model.with_context( + active_ids=files.ids + ).action_wizard_dms_file_move() + wizard_model = self.env[res["res_model"]].with_context(**res["context"]) + wizard = wizard_model.create({"directory_id": self.directory.id}) + self.assertEqual(wizard.count_files, 2, msg="Wizard has 2 files") + wizard.process() + self.assertEqual( + self.file2.directory_id, self.directory, msg="File2 has a new directory" + ) + self.assertEqual( + file3.directory_id, self.directory, msg="File3 has a new directory" + ) diff --git a/dms/tests/test_file_database.py b/dms/tests/test_file_database.py new file mode 100644 index 000000000..d619db378 --- /dev/null +++ b/dms/tests/test_file_database.py @@ -0,0 +1,154 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.exceptions import UserError +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + + +class FileDatabaseTestCase(StorageDatabaseBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.file_demo_01 = cls.env.ref("dms.file_01_demo") + cls.directory2 = cls.create_directory(storage=cls.storage) + cls.new_storage2 = cls.create_storage(save_type="database") + cls.directory3 = cls.create_directory(storage=cls.new_storage2) + + @users("dms-manager", "dms-user") + def test_create_file(self): + root_directory = self.create_directory(storage=self.storage) + self.create_file(directory=root_directory) + sub_directory = self.create_directory(directory=root_directory) + self.create_file(sub_directory) + self.assertEqual(root_directory.count_total_files, 2, "Total files should be 2") + self.assertEqual( + sub_directory.count_files, 1, "Subdirectory total files should be 1" + ) + + @users("dms-manager", "dms-user") + def test_lock_file(self): + file = self.create_file(directory=self.directory) + file.lock() + self.assertTrue(file.is_locked, "File should be locked") + file.unlock() + self.assertFalse(file.is_locked, "File should be unlocked") + + @users("dms-manager", "dms-user") + def test_copy_file(self): + copy_file = self.file.copy() + self.assertEqual( + self.file.storage_id, copy_file.storage_id, "Storage should be the same" + ) + self.assertEqual( + self.file.content, copy_file.content, "Content should be the same" + ) + + @users("dms-manager", "dms-user") + def test_rename_file(self): + file = self.create_file(directory=self.directory) + extension = file.extension + file.write({"name": f"test-{self.env.user.login}.jpg"}) + self.assertNotEqual(file.extension, extension, "Extension should be different") + + @users("dms-manager", "dms-user") + def test_move_file(self): + file = self.create_file(directory=self.directory) + path_names = file.path_names + file.write({"directory_id": self.directory2.id}) + file.flush_recordset() + self.assertNotEqual( + path_names, file.path_names, "Path names should be different" + ) + + @users("dms-manager", "dms-user") + def test_move_directory(self): + with self.assertRaises( + UserError, msg="Directory can't have any parent, because it is " "root" + ): + self.directory.write( + { + "is_root_directory": False, + "parent_id": self.directory3.id, + } + ) + + @users("dms-manager", "dms-user") + @mute_logger("odoo.models.unlink") + def test_unlink_file(self): + file = self.create_file(directory=self.directory) + file.unlink() + self.assertFalse(file.exists(), "File should not exist") + + @users("dms-manager", "dms-user") + def test_compute_thumbnail(self): + self.assertTrue(self.file_demo_01.image_128, "Thumbnail should be computed") + + @users("dms-manager", "dms-user") + def test_compute_path_names(self): + self.assertTrue(self.file.path_names, "Path names should be computed") + + @users("dms-manager", "dms-user") + def test_compute_path_json(self): + self.assertTrue(self.file.path_json, "Path json should be computed") + + @users("dms-manager", "dms-user") + def test_compute_mimetype(self): + self.assertTrue(self.file.mimetype, "Mimetype should be computed") + + @users("dms-manager", "dms-user") + def test_compute_extension(self): + self.assertTrue(self.file.extension, "Extension should be computed") + + @users("dms-manager", "dms-user") + def test_size_calculation(self): + self.assertTrue(self.file.size, "Size should be computed") + + @users("dms-manager", "dms-user") + def test_checksum_calculation(self): + self.assertTrue(self.file.checksum, "Checksum should be computed") + + @users("dms-manager", "dms-user") + def test_compute_content(self): + self.assertTrue( + self.file.with_context(bin_size=True).content, + "Content should be computed (with bin_size)", + ) + self.assertTrue( + self.file.with_context(bin_size=False).content, + "Content should be computed (without bin_size)", + ) + self.assertNotEqual( + self.file.with_context(bin_size=False).content, + self.file.with_context(bin_size=True).content, + "Content should be different", + ) + + @users("dms-manager", "dms-user") + def test_compute_save_type(self): + self.assertTrue(self.file.save_type, "Save type should be computed") + + @users("dms-manager", "dms-user") + def test_compute_migration(self): + self.assertTrue(self.file.migration, "Migration should be computed") + + @users("dms-manager", "dms-user") + def test_search_panel(self): + self.assertTrue( + self.file.search_panel_select_range("directory_id"), + "Directory should be selected", + ) + self.assertTrue( + self.file.search_panel_select_multi_range("directory_id"), + "Directory should be selected", + ) + self.assertTrue( + self.file.search_panel_select_multi_range("tag_ids"), + "Tag should be selected", + ) + res = self.file.search_panel_select_range("directory_id", enable_counters=True) + self.assertTrue(self.directory2.id == x["id"] for x in res["values"]) diff --git a/dms/tests/test_portal.py b/dms/tests/test_portal.py new file mode 100644 index 000000000..dbc321ae6 --- /dev/null +++ b/dms/tests/test_portal.py @@ -0,0 +1,90 @@ +# Copyright 2021-2025 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl) + +import odoo.tests +from odoo.exceptions import AccessError +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageAttachmentBaseCase + + +@odoo.tests.tagged("post_install", "-at_install") +class TestDmsPortal(odoo.tests.HttpCase, StorageAttachmentBaseCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.partner = cls.env.ref("base.partner_demo_portal") + cls.portal_user = cls.partner.user_ids + cls._create_attachment("test.txt") + cls._create_attachment("test2.txt", cls.other_partner) + cls.directory_partner = cls._get_partner_directory() + cls.other_directory_partner = cls._get_partner_directory(cls.other_partner) + cls.file_partner = cls.directory_partner.file_ids[0] + cls.other_file_partner = cls.other_directory_partner.file_ids[0] + + def test_access_portal(self): + self.authenticate("portal", "portal") + # 404: Incorrect access_token + file_text = self.create_file(directory=self.directory_partner) + url = f"{file_text.access_url}&access_token=abc-def" + response = self.url_open(url, timeout=20) + self.assertEqual( + response.status_code, 404, "Can't access file with incorrect access_token" + ) + # 200 + response = self.url_open(self.file_partner._get_share_url(), timeout=20) + self.assertEqual( + response.status_code, 200, "Can access file with correct access_token" + ) + # 200 + response = self.url_open(self.directory_partner._get_share_url(), timeout=20) + self.assertEqual( + response.status_code, 200, "Can access directory with correct access_token" + ) + + def test_tour(self): + for tour in ("dms_portal_mail_tour", "dms_portal_partners_tour"): + with self.subTest(tour=tour): + self.start_tour("/my", tour, login="portal") + + @users("portal") + @mute_logger("odoo.addons.base.models.ir_rule") + def test_permission_portal_user_access_own_attachment(self): + """ + The user can access its own attachments, even if its access group are not set + """ + # Has to manually su=False because the portal user is not a superuser, + # but odoo uses somewhere sudo() internally + file = self.file_partner.with_user(self.env.user).with_env(self.env(su=False)) + directory = self.directory_partner.with_user(self.env.user).with_env( + self.env(su=False) + ) + # Portal user can only read + file.check_access("read") + + # Portal user can't do anything else + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("write") + file.check_access("unlink") + directory.check_access("create") + + @users("portal") + @mute_logger("odoo.addons.base.models.ir_rule") + def test_permission_portal_user_access_other_attachment(self): + """ + The user can't access other attachments if its access group are not set + """ + # Has to manually su=False because the portal user is not a superuser, + # but odoo uses somewhere sudo() internally + file = self.other_file_partner.with_user(self.env.user).with_env( + self.env(su=False) + ) + # file.invalidate_recordset() + # Portal user can't do anything + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("read") + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("write") + with self.assertRaises(AccessError, msg="Portal user should not have access"): + file.check_access("unlink") diff --git a/dms/tests/test_storage_attachment.py b/dms/tests/test_storage_attachment.py new file mode 100644 index 000000000..f0a1a898b --- /dev/null +++ b/dms/tests/test_storage_attachment.py @@ -0,0 +1,168 @@ +# Copyright 2021-2022 Tecnativa - Víctor Martínez +# Copyright 2021 Tecnativa - João Marques +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageAttachmentBaseCase + + +class StorageAttachmentTestCase(StorageAttachmentBaseCase): + @users("dms-manager") + @mute_logger("odoo.models.unlink") + def test_storage_attachment(self): + self._create_attachment("demo.txt") + self.assertTrue( + self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt"), + "File should be created", + ) + directory = self._get_partner_directory() + self.assertEqual(directory.count_files, 1, "Directory should have 1 file") + self.assertEqual( + directory.file_ids[0].name, "demo.txt", "File should be demo.txt" + ) + file_01 = self.create_file(directory=directory) + self.assertEqual(file_01.storage_id, self.storage, "Storage should be the same") + self.assertEqual( + file_01.storage_id.save_type, "attachment", "Save type should be attachment" + ) + self.assertEqual(file_01.save_type, "database", "Save type should be database") + self.assertEqual(directory.count_files, 2, "Directory should have 2 files") + # Assert cascade removal + self.partner.unlink() + self.assertFalse(file_01.exists(), "File should not exist") + self.assertFalse(directory.exists(), "Directory should not exist") + + @users("dms-manager") + def test_storage_attachment_record_db_unlink(self): + self._create_attachment("demo.txt") + self.assertTrue( + self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt") + ) + directory = self._get_partner_directory() + self.assertEqual(directory.res_model, self.partner._name) + self.assertEqual(directory.res_id, self.partner.id) + directory.res_id = -1 # Trick to reference a non-existing record + directories = self.env["dms.directory"].search([]) + self.assertNotIn(directory.id, directories.ids) + + @mute_logger("odoo.models.unlink") + def test_storage_attachment_unlink_lock_file(self): + group_partner_manager = self.env.ref("base.group_partner_manager") + self.dms_manager_user.write({"groups_id": [(4, group_partner_manager.id)]}) + self.dms_user.write({"groups_id": [(4, group_partner_manager.id)]}) + attachment = self._create_attachment("demo.txt") + attachment = attachment.with_user(self.dms_manager_user) + file = self.storage.storage_file_ids.filtered(lambda x: x.name == "demo.txt") + file.with_user(self.dms_user).lock() + self.assertTrue(file.is_locked) + self.assertFalse(file.is_lock_editor) + file.with_user(self.dms_user).unlock() + self.assertFalse(file.is_locked) + attachment.unlink() + self.assertFalse(file.exists()) + + @users("dms-manager") + def test_storage_attachment_misc(self): + attachment = self._create_attachment("demo.txt") + root_directory = self.storage.root_directory_ids.filtered( + lambda x: x.is_root_directory + ) + self.assertEqual( + root_directory.count_directories, + 1, + "Root directory should have 1 directory", + ) + self.assertEqual( + len(root_directory.child_directory_ids), + 1, + "Root directory should have 1 child directory", + ) + child_directory = root_directory.child_directory_ids[0] + self.assertEqual( + child_directory.res_model, + self.partner_model._name, + "Model should be res.partner", + ) + self.assertEqual( + child_directory.res_id, self.partner.id, "Record ID should be partner ID" + ) + self.assertEqual( + len(root_directory.child_directory_ids.file_ids), + 1, + "Root directory should have 1 file", + ) + dms_file = root_directory.child_directory_ids.file_ids[0] + self.assertEqual( + dms_file.attachment_id, attachment, "Attachment should be the same" + ) + self.assertEqual(dms_file.name, "demo.txt", "Name should be demo.txt") + self.assertEqual( + dms_file.res_model, self.partner_model._name, "Model should be res.partner" + ) + self.assertEqual( + dms_file.res_id, self.partner.id, "Record ID should be partner ID" + ) + directory = self._get_partner_directory() + file_01 = self.create_file(directory=directory) + self.assertEqual( + file_01.res_model, self.partner_model._name, "Model should be res.partner" + ) + self.assertEqual( + file_01.res_id, self.partner.id, "Record ID should be partner ID" + ) + self.assertEqual(file_01.storage_id, self.storage, "Storage should be the same") + self.assertEqual( + file_01.storage_id.save_type, "attachment", "Save type should be attachment" + ) + self.assertEqual(file_01.save_type, "database", "Save type should be database") + self.assertEqual( + self.storage.count_storage_files, 2, "Storage should have 2 files" + ) + dms_file.unlink() + self.assertFalse(attachment.exists()) + + @users("dms-manager") + def test_storage_attachment_directory_record_ref_access_dms_manager(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + + @users("dms-user") + def test_storage_attachment_directory_record_ref_access_dms_user(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + directory.invalidate_recordset() + self.assertTrue( + directory.permission_read, "Permission read should still be True" + ) + + @users("basic-user") + def test_storage_attachment_directory_record_ref_access_basic_user(self): + self._create_attachment("demo.txt") + directory = self._get_partner_directory() + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertTrue(directory.permission_read, "Permission read should be True") + self.assertEqual(self.partner.type, "contact", "Type should be contact") + self.partner.sudo().write({"type": "other"}) + self.assertEqual(self.partner.type, "other", "Type should now be other") + self.assertTrue( + directory.sudo().permission_read, "Permission read should be True" + ) + + @users("basic-user") + def test_create_attachment_basic_user(self): + attachment = self._create_attachment("Test file") + self.assertEqual(attachment.name, "Test file", "Name should be Test file") + self.assertTrue(self._get_partner_directory(), "Directory should exist") diff --git a/dms/tests/test_storage_database.py b/dms/tests/test_storage_database.py new file mode 100644 index 000000000..cd8dab616 --- /dev/null +++ b/dms/tests/test_storage_database.py @@ -0,0 +1,138 @@ +# Copyright 2017-2019 MuK IT GmbH. +# Copyright 2020 Creu Blanca +# Copyright 2022 Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo.tests.common import users +from odoo.tools import mute_logger + +from .common import StorageDatabaseBaseCase + + +class StorageDatabaseTestCase(StorageDatabaseBaseCase): + @users("dms-manager") + def test_action_storage_migrate(self): + self.storage.action_storage_migrate() + + @users("dms-manager", "dms-user") + def test_count_storage_directories(self): + self.assertTrue( + self.storage.count_storage_directories, "Storage should have directories" + ) + + @users("dms-manager", "dms-user") + def test_count_storage_files(self): + self.assertTrue(self.storage.count_storage_files, "Storage should have files") + + @users("dms-manager") + @mute_logger("odoo.models.unlink") + def test_file_migrate(self): + root_directory = self.storage.root_directory_ids.filtered( + lambda x: x.is_root_directory + ) + file_01 = self.create_file(directory=root_directory) + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_01.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.storage.write({"save_type": "file"}) + directory = self.create_directory(storage=self.storage) + file_02 = self.create_file(directory=directory) + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_01.storage_id.save_type, "file", "Storage should be file") + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_02.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_02.save_type, "file", "File savetype should be file") + self.storage.action_storage_migrate() + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_01.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_01.save_type, "file", "File savetype should be file") + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual(file_02.storage_id.save_type, "file", "Storage should be file") + self.assertEqual(file_02.save_type, "file", "File savetype should be file") + self.storage.write({"save_type": "database"}) + self.storage.action_storage_migrate() + self.assertEqual( + file_01.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_01.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_01.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "database", "Storage should be database" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.storage.write({"save_type": "attachment"}) + model_partner = self.env.ref("base.model_res_partner") + partner = self.partner_model.create({"name": "Test partner"}) + directory = self.directory_model.create( + { + "name": self.partner_model._name, + "model_id": model_partner.id, + "res_id": partner.id, + "parent_id": self.storage.root_directory_ids[0].id, + "storage_id": self.storage.id, + } + ) + file_03 = self.create_file(directory=directory) + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_03.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_03.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_03.save_type, "database", "File savetype should be database" + ) + self.storage.action_storage_migrate() + self.assertEqual( + file_02.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_02.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_02.save_type, "database", "File savetype should be database" + ) + self.assertEqual( + file_03.storage_id, self.storage, "File should be in the storage" + ) + self.assertEqual( + file_03.storage_id.save_type, "attachment", "Storage should be attachment" + ) + self.assertEqual( + file_03.save_type, "database", "File savetype should be database" + ) diff --git a/dms/tools/__init__.py b/dms/tools/__init__.py new file mode 100644 index 000000000..1f48df096 --- /dev/null +++ b/dms/tools/__init__.py @@ -0,0 +1 @@ +from . import file diff --git a/dms/tools/file.py b/dms/tools/file.py new file mode 100644 index 000000000..3f3bce3fd --- /dev/null +++ b/dms/tools/file.py @@ -0,0 +1,103 @@ +# Copyright 2020 Antoni Romera +# Copyright 2017-2019 MuK IT GmbH +# Copyright 2024 Subteno - Timothée Vannier (https://www.subteno.com). +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +import mimetypes +import os +import re +import shutil +import tempfile + +from odoo.tools.mimetypes import guess_mimetype + + +def check_name(name): + """ + Check if a file name is valid. + + :param str name: The file name to check. + :return: True if the file name is valid, False otherwise. + :rtype: bool + """ + tmp_dir = tempfile.mkdtemp() + try: + open(os.path.join(tmp_dir, name), "a").close() + except OSError: + return False + finally: + shutil.rmtree(tmp_dir) + return True + + +def compute_name(name, suffix, escape_suffix): + """ + Compute a new name by adding a suffix to the original name. + + :param str name: The original name. + :param int suffix: The suffix to add. + :param bool escape_suffix: If True, the suffix is added in between the name and + the file extension. + :return: The new name. + :rtype: str + """ + if escape_suffix: + name, extension = os.path.splitext(name) + return f"{name}({suffix}){extension}" + + return f"{name}({suffix})" + + +def unique_name(name, names, escape_suffix=False): + """ + Generate a unique name by adding a suffix to the original name. + + :param str name: The original name. + :param list names: The list of existing names. + :param bool escape_suffix: If True, the suffix is added in between the name and + the file extension. + :return: The unique name. + :rtype: str + """ + if name not in names: + return name + + # Extract the suffix from the name + # e.g: "file(1).txt" -> "1" + # "Directory (1)(2)" -> "2" + digits = re.compile(r"\((\d+)\)(\.\w+)?$") + match = digits.search(name) + suffix = 1 + if match: + suffix = int(match.group(1)) + 1 + # get the name without the suffix and append the extension + name = name[: match.span()[0]] + (match.group(2) or "") + + name = compute_name(name, suffix, escape_suffix) + while name in names: + # has to check recursively if the new name is unique because the user can + # rename the file with suffix n+1 + # and then duplicate the file n, leading to a new file with suffix n+1 which + # is already used. + return unique_name(name, names, escape_suffix) + return name + + +def guess_extension(filename=None, mimetype=None, binary=None): + """ + Guess the extension of a file. + + :param str filename: The name of the file. + :param str mimetype: The mimetype of the file. + :param str binary: The binary content of the file. + + :return: The extension of the file. + :rtype: str + """ + extension = filename and os.path.splitext(filename)[1][1:].strip().lower() + if not extension and mimetype and mimetype != "application/x-empty": + extension = mimetypes.guess_extension(mimetype)[1:].strip().lower() + if not extension and binary: + mimetype = guess_mimetype(binary, default="") + extension = mimetypes.guess_extension(mimetype)[1:].strip().lower() + return extension diff --git a/dms/views/dms_access_groups_views.xml b/dms/views/dms_access_groups_views.xml new file mode 100644 index 000000000..7d501acd9 --- /dev/null +++ b/dms/views/dms_access_groups_views.xml @@ -0,0 +1,112 @@ + + + + + dms_access_groups.list + dms.access.group + + + + + + + + + + + + + dms_access.group.form + dms.access.group + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + Access Groups + dms.access.group + list,form + + +
diff --git a/dms/views/dms_category.xml b/dms/views/dms_category.xml new file mode 100644 index 000000000..9a6c60030 --- /dev/null +++ b/dms/views/dms_category.xml @@ -0,0 +1,109 @@ + + + + + dms_category.search + dms.category + + + + + + + + + dms_category.list + dms.category + + + + + + + + + + dms_category.form + dms.category + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Categories + dms.category + list,form + {'search_default_all': 1} + +

+ Create a new Category. +

+

+ Categories are used to categorize Documents. +

+
+
+ diff --git a/dms/views/dms_directory.xml b/dms/views/dms_directory.xml new file mode 100644 index 000000000..4d048a53f --- /dev/null +++ b/dms/views/dms_directory.xml @@ -0,0 +1,727 @@ + + + + + Subdirectories + dms.directory + kanban,list,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_parent_id': active_id, + 'searchpanel_default_parent_id': active_id + } + + +

+ Click to add a new directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + Files + dms.file + kanban,list,graph,pivot,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_directory_id': active_id, + 'searchpanel_default_directory_id': active_id + } + + +

+ Click to add a new file. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + Subdirectories + dms.directory + kanban,list,form + + [ + ("parent_id", "child_of", active_id), + ("is_hidden", "=", False), + ("id", "!=", active_id), + ] + + + { + 'default_parent_id': active_id, + } + + +

+ Click to add a new directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + Files + dms.file + kanban,list,graph,pivot,form + + [ + ("is_hidden", "=", False), + ] + + + { + 'default_directory_id': active_id, + 'searchpanel_default_directory_id': active_id + } + + +

+ Click to add a new file. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + dms_directory.search + dms.directory + + + + + + + + + + + + + + + + + + + + + + + + + + dms_directory.kanban + dms.directory + + + + + + + + + + + + + + + + + + + + +
+
+
+ + + +
+
+ + + + +
+
+
+ +
+
+
+ +
+
+
+ Icon +
+
+ + + +
+
+ +
+
+
+
+
+
+ + dms_directory.list + dms.directory + + + + + + + + + + + + + dms_directory.form + dms.directory + +
+
+ +
+ + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Directories + dms.directory + kanban,list,form + [("is_hidden", "=", False)] + +

+ Add a new Directory. +

+

+ Directories can be used to structure and organize + files directly in Odoo. +

+
+
+ + dms_directory.form + dms.directory + + primary + + + 1 + + + 1 + + + 1 + + + 1 + + + + + + + + + + + + + + +
+
+
+
+
+
+ + New Root Directory + dms.directory + form + new + + + diff --git a/dms/views/dms_file.xml b/dms/views/dms_file.xml new file mode 100644 index 000000000..c19a04156 --- /dev/null +++ b/dms/views/dms_file.xml @@ -0,0 +1,638 @@ + + + + + dms_file.search + dms.file + + + + + + + + + + + + + + + + + + + + + + + + + + dms_file.kanban + dms.file + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + Icon + +
+
+ + + +
+
+
+ + + + +
+
+
+
+
+ + + + + + + dms_file.kanban.wizard.selection + dms.file + + 9999 + primary + + + + o_kanban_mobile mk_file_kanban_view + + +
+ + + + + dms_file.list + dms.file + + + + + + + + + + + + + + + + + + dms_file.graph + dms.file + + + + + + + + + dms_file.pivot + dms.file + + + + + + + + + + dms_file.form + dms.file + +
+
+
+ + + + + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Files + dms.file + kanban,list,graph,pivot,form + [("is_hidden", "=", False)] + +

+ Add a new File. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + + Files + dms.file + new + kanban + {'create': False} + + + + dms_file.search + dms.file + + + + + + + + + + + + + + + dms_file.list + dms.file + + + + + + + + + + + + + + + Files + dms.file + list + + [('require_migration', '=', True), '|', ('active', '=', False), ('active', '!=', False)] + + {'search_default_group_storage': 1} + + +

+ Add a new File. +

+

+ Files are used to save content directly in Odoo. +

+
+
+ + dms_file.form + dms.file + + primary + + + 1 + + + 1 + +
+
+
+
+
+
+ + New Root Directory + dms.file + form + new + + + + Move + + + + list + code + + action = model.action_wizard_dms_file_move() + + + diff --git a/dms/views/dms_tag.xml b/dms/views/dms_tag.xml new file mode 100644 index 000000000..ca0eb4708 --- /dev/null +++ b/dms/views/dms_tag.xml @@ -0,0 +1,151 @@ + + + + + dms_tag.search + dms.tag + + + + + + + + + + + + + dms_tag.kanban + dms.tag + + + + +
+ +
+ +
+
+
+ +
+ +
+
+
+
+
+
+ + dms_tag.list + dms.tag + + + + + + + + + + dms_tag.form + dms.tag + +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + Tags + dms.tag + kanban,list,form + {'search_default_group_by_category': 1} + +

+ Click to create a new tag. +

+

+ Tags are used to categorize Documents. +

+
+
+ diff --git a/dms/views/menu.xml b/dms/views/menu.xml new file mode 100644 index 000000000..6957ad96d --- /dev/null +++ b/dms/views/menu.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/dms/views/res_config_settings.xml b/dms/views/res_config_settings.xml new file mode 100644 index 000000000..1d5a38372 --- /dev/null +++ b/dms/views/res_config_settings.xml @@ -0,0 +1,56 @@ + + + + + res.config.settings.view.form.inherit.dms + res.config.settings + + + + + + + + + + + + + +
+ +
+ + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +º + + Storages + dms.storage + list,form + +

+ Create a new Storage object. +

+

+ Storages are used to configure your Documents. +

+
+
+ + dms_storage.form + dms.storage + + primary + + + 1 + + + 1 + +
+
+
+
+
+
+ + New Storage + dms.storage + form + new + + +
diff --git a/dms/wizards/__init__.py b/dms/wizards/__init__.py new file mode 100644 index 000000000..8f4a16b6f --- /dev/null +++ b/dms/wizards/__init__.py @@ -0,0 +1,2 @@ +from . import wizard_dms_file_move +from . import wizard_dms_share diff --git a/dms/wizards/wizard_dms_file_move.py b/dms/wizards/wizard_dms_file_move.py new file mode 100644 index 000000000..53109b581 --- /dev/null +++ b/dms/wizards/wizard_dms_file_move.py @@ -0,0 +1,25 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class WizardDmsFileMove(models.TransientModel): + _name = "wizard.dms.file.move" + _description = "Wizard Dms File Move" + + count_files = fields.Integer(readonly=True) + directory_id = fields.Many2one( + comodel_name="dms.directory", required=True, string="Directory" + ) + + @api.model + def default_get(self, fields): + vals = super().default_get(fields) + if self.env.context.get("active_ids"): + vals.update({"count_files": len(self.env.context.get("active_ids"))}) + return vals + + def process(self): + items = self.env["dms.file"].browse(self.env.context.get("active_ids")) + items.write({"directory_id": self.directory_id}) diff --git a/dms/wizards/wizard_dms_file_move_views.xml b/dms/wizards/wizard_dms_file_move_views.xml new file mode 100644 index 000000000..127d7b8b9 --- /dev/null +++ b/dms/wizards/wizard_dms_file_move_views.xml @@ -0,0 +1,41 @@ + + + + + wizard.dms.file.move.form + wizard.dms.file.move + +
+ + + + + +
+
+ +
+
+ + Move files + wizard.dms.file.move + form + new + +
diff --git a/dms/wizards/wizard_dms_share.py b/dms/wizards/wizard_dms_share.py new file mode 100644 index 000000000..c36a3c946 --- /dev/null +++ b/dms/wizards/wizard_dms_share.py @@ -0,0 +1,19 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, models + + +class WizardDmsShare(models.TransientModel): + _name = "wizard.dms.share" + _inherit = "portal.share" + _description = "Wizard for sharing DMS records" + + @api.model + def _selection_target_model(self): + return [ + (model.model, model.name) + for model in self.env["ir.model"] + .sudo() + .search([("model", "in", ("dms.directory", "dms.file"))]) + ] diff --git a/dms/wizards/wizard_dms_share_views.xml b/dms/wizards/wizard_dms_share_views.xml new file mode 100644 index 000000000..affae0783 --- /dev/null +++ b/dms/wizards/wizard_dms_share_views.xml @@ -0,0 +1,28 @@ + + + + wizard.dms.share.form + wizard.dms.share + + primary + + + 1 + + + + + Share + wizard.dms.share + + form + new + + + Share + wizard.dms.share + + form + new + + diff --git a/dms_auto_classification/README.rst b/dms_auto_classification/README.rst new file mode 100644 index 000000000..13bcb3321 --- /dev/null +++ b/dms_auto_classification/README.rst @@ -0,0 +1,116 @@ +================================ +Auto classify documents into DMS +================================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:8a02ca941edb3f66482a033b8682f3ba63cac7f9a046686783fa77167a1ca51f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/dms_auto_classification + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-dms_auto_classification + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Automatically classify files within a .zip file to the corresponding DMS +directory(s). + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +1. Go to Documents / Configuration / Classification Templates and create + a new template. +2. You can set patterns (regex expressions) for filenames and + directories. + +Example of filename pattern to use only .txt files: .txt$ Directory +pattern example 1: Documents Directory pattern example 1: Documents / +Data + +If the pattern doesn't contain path separators (/), the file name will +be search across all the subdirectories. + +Usage +===== + +1. Go to Documents / Auto Classification and select a template and a + .zip file. +2. Press the Analyze button +3. As many lines will be set as the number of files contained in the + .zip file and apply the filename pattern. +4. The full path to the file will be displayed in each detail line. +5. Press the Classify button +6. The files (dms.file) will be created in the corresponding + directories. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/dms_auto_classification/__init__.py b/dms_auto_classification/__init__.py new file mode 100644 index 000000000..e1e144406 --- /dev/null +++ b/dms_auto_classification/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models +from . import wizards diff --git a/dms_auto_classification/__manifest__.py b/dms_auto_classification/__manifest__.py new file mode 100644 index 000000000..f2894c046 --- /dev/null +++ b/dms_auto_classification/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Auto classify documents into DMS", + "version": "18.0.1.0.0", + "category": "Document Management", + "website": "https://github.com/OCA/dms", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["dms"], + "installable": True, + "data": [ + "security/ir.model.access.csv", + "security/security.xml", + "views/dms_classification_template_views.xml", + "wizards/wizard_dms_classification_views.xml", + ], + "demo": ["demo/dms_classification_template_demo.xml"], + "maintainers": ["victoralmau"], +} diff --git a/dms_auto_classification/demo/dms_classification_template_demo.xml b/dms_auto_classification/demo/dms_classification_template_demo.xml new file mode 100644 index 000000000..93cd98700 --- /dev/null +++ b/dms_auto_classification/demo/dms_classification_template_demo.xml @@ -0,0 +1,11 @@ + + + + Documents template + .txt$ + Documents + + diff --git a/dms_auto_classification/i18n/dms_auto_classification.pot b/dms_auto_classification/i18n/dms_auto_classification.pot new file mode 100644 index 000000000..855dfbbc8 --- /dev/null +++ b/dms_auto_classification/i18n/dms_auto_classification.pot @@ -0,0 +1,199 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__analyze +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Analyze" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_wizard_dms_classification +#: model:ir.ui.menu,name:dms_auto_classification.menu_wizard_dms_classification +msgid "Auto Classification" +msgstr "" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Cancel" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_dms_classification_template +#: model:ir.ui.menu,name:dms_auto_classification.menu_dms_classification_template +msgid "Classification Templates" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__classified +msgid "Classified" +msgstr "" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Classify" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__company_id +msgid "Company" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_date +msgid "Created on" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_filename +msgid "Data Filename" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__detail_ids +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Details" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__directory_id +msgid "Directory" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__directory_pattern +msgid "Directory Pattern" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__draft +msgid "Draft" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_file +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_id +msgid "File" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__data_file +msgid "File content" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_name +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "File name" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__filename_pattern +msgid "Filename Pattern" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__full_path +msgid "Full path" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__id +msgid "ID" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__name +msgid "Name" +msgstr "" + +#. module: dms_auto_classification +#. odoo-python +#: code:addons/dms_auto_classification/wizards/wizard_dms_classification.py:0 +msgid "Only .zip files are allowed" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__parent_id +msgid "Parent" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__sequence +msgid "Sequence" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__state +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__state +msgid "State" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__template_id +msgid "Template" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__to_classify +msgid "To classify" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification +msgid "Wizard Dms Classification" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "" diff --git a/dms_auto_classification/i18n/es.po b/dms_auto_classification/i18n/es.po new file mode 100644 index 000000000..c103c1e5c --- /dev/null +++ b/dms_auto_classification/i18n/es.po @@ -0,0 +1,211 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-05 08:37+0000\n" +"PO-Revision-Date: 2024-04-22 16:36+0000\n" +"Last-Translator: Víctor Martínez \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__analyze +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Analyze" +msgstr "Analizar" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_wizard_dms_classification +#: model:ir.ui.menu,name:dms_auto_classification.menu_wizard_dms_classification +msgid "Auto Classification" +msgstr "Auto-clasificación" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_dms_classification_template +#: model:ir.ui.menu,name:dms_auto_classification.menu_dms_classification_template +msgid "Classification Templates" +msgstr "Plantillas de clasificación" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__classified +msgid "Classified" +msgstr "Clasificado" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Classify" +msgstr "Clasificar" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__company_id +msgid "Company" +msgstr "Compañía" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_filename +msgid "Data Filename" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__detail_ids +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Details" +msgstr "Detalles" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__directory_id +msgid "Directory" +msgstr "Directorio" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__directory_pattern +msgid "Directory Pattern" +msgstr "Patrón del directorio" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__display_name +msgid "Display Name" +msgstr "Nombre a Mostrar" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "Plantilla de clasificación Dms" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__draft +msgid "Draft" +msgstr "Borrador" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_file +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_id +msgid "File" +msgstr "Archivo" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__data_file +msgid "File content" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_name +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "File name" +msgstr "Nombre de archivo" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__filename_pattern +msgid "Filename Pattern" +msgstr "Patrón de nombre de archivo" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__full_path +msgid "Full path" +msgstr "" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__id +msgid "ID" +msgstr "ID" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template____last_update +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification____last_update +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_date +msgid "Last Updated on" +msgstr "Ultima actualización el" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__name +msgid "Name" +msgstr "Nombre" + +#. module: dms_auto_classification +#. odoo-python +#: code:addons/dms_auto_classification/wizards/wizard_dms_classification.py:0 +#, python-format +msgid "Only .zip files are allowed" +msgstr "Solo se permiten archivos .zip" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__parent_id +msgid "Parent" +msgstr "Padre" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__state +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__state +msgid "State" +msgstr "Estado" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__template_id +msgid "Template" +msgstr "Plantilla" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__to_classify +msgid "To classify" +msgstr "A clasificar" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification +msgid "Wizard Dms Classification" +msgstr "Asistente Dms Clasificación" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "Asistente de Clasificación Dms Detalle" diff --git a/dms_auto_classification/i18n/it.po b/dms_auto_classification/i18n/it.po new file mode 100644 index 000000000..60e8ab5f7 --- /dev/null +++ b/dms_auto_classification/i18n/it.po @@ -0,0 +1,210 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-03 10:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__analyze +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Analyze" +msgstr "Analizza" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_wizard_dms_classification +#: model:ir.ui.menu,name:dms_auto_classification.menu_wizard_dms_classification +msgid "Auto Classification" +msgstr "Classificazione automatica" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Cancel" +msgstr "Annulla" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_dms_classification_template +#: model:ir.ui.menu,name:dms_auto_classification.menu_dms_classification_template +msgid "Classification Templates" +msgstr "Modello classificazione" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__classified +msgid "Classified" +msgstr "Classificato" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Classify" +msgstr "Classifica" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__company_id +msgid "Company" +msgstr "Azienda" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_filename +msgid "Data Filename" +msgstr "Nome file dati" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__detail_ids +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Details" +msgstr "Dettagli" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__directory_id +msgid "Directory" +msgstr "Cartella" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__directory_pattern +msgid "Directory Pattern" +msgstr "Schema cartella" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "Modello classificazione DMS" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__draft +msgid "Draft" +msgstr "Bozza" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_file +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_id +msgid "File" +msgstr "File" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__data_file +msgid "File content" +msgstr "Contenuto file" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_name +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "File name" +msgstr "Nome file" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__filename_pattern +msgid "Filename Pattern" +msgstr "Schema nome file" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__full_path +msgid "Full path" +msgstr "Percorso completo" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__id +msgid "ID" +msgstr "ID" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template____last_update +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification____last_update +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__name +msgid "Name" +msgstr "Nome" + +#. module: dms_auto_classification +#. odoo-python +#: code:addons/dms_auto_classification/wizards/wizard_dms_classification.py:0 +#, python-format +msgid "Only .zip files are allowed" +msgstr "Sono consentiti solo file .zip" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__parent_id +msgid "Parent" +msgstr "Padre" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__state +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__state +msgid "State" +msgstr "Stato" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__template_id +msgid "Template" +msgstr "Modello" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__to_classify +msgid "To classify" +msgstr "Da classificare" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification +msgid "Wizard Dms Classification" +msgstr "Procedura guidata classificazione DMS" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "Procedura guidata dettagli classificazione DMS" diff --git a/dms_auto_classification/i18n/sv.po b/dms_auto_classification/i18n/sv.po new file mode 100644 index 000000000..ae1e163c9 --- /dev/null +++ b/dms_auto_classification/i18n/sv.po @@ -0,0 +1,202 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-09-18 17:42+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__analyze +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Analyze" +msgstr "Objekta" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_wizard_dms_classification +#: model:ir.ui.menu,name:dms_auto_classification.menu_wizard_dms_classification +msgid "Auto Classification" +msgstr "Klassificering av bilar" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Cancel" +msgstr "Avbryt" + +#. module: dms_auto_classification +#: model:ir.actions.act_window,name:dms_auto_classification.action_dms_classification_template +#: model:ir.ui.menu,name:dms_auto_classification.menu_dms_classification_template +msgid "Classification Templates" +msgstr "Klassificeringsmallar" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__classified +msgid "Classified" +msgstr "Klassificerad" + +#. module: dms_auto_classification +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Classify" +msgstr "Klassificera" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__company_id +msgid "Company" +msgstr "Bolag" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__create_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__create_date +msgid "Created on" +msgstr "Skapad på" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_filename +msgid "Data Filename" +msgstr "Datum Filnamn" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__detail_ids +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "Details" +msgstr "Detaljer" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__directory_id +msgid "Directory" +msgstr "Katalog" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__directory_pattern +msgid "Directory Pattern" +msgstr "Katalogmönster" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__display_name +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "Mall för Dms-klassificering" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification__state__draft +msgid "Draft" +msgstr "Utkast" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__data_file +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_id +msgid "File" +msgstr "Fil" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__data_file +msgid "File content" +msgstr "Filens innehåll" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__file_name +#: model_terms:ir.ui.view,arch_db:dms_auto_classification.view_wizard_dms_classification_form +msgid "File name" +msgstr "Filens namn" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__filename_pattern +msgid "Filename Pattern" +msgstr "Mönster för filnamn" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__full_path +msgid "Full path" +msgstr "Fullständig sökväg" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__id +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__id +msgid "ID" +msgstr "ID" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_uid +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__write_date +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad den" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__name +msgid "Name" +msgstr "Namn" + +#. module: dms_auto_classification +#. odoo-python +#: code:addons/dms_auto_classification/wizards/wizard_dms_classification.py:0 +msgid "Only .zip files are allowed" +msgstr "Endast .zip-filer är tillåtna" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__parent_id +msgid "Parent" +msgstr "Överordnad" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_dms_classification_template__sequence +msgid "Sequence" +msgstr "Sekvens" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__state +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification_detail__state +msgid "State" +msgstr "Stat" + +#. module: dms_auto_classification +#: model:ir.model.fields,field_description:dms_auto_classification.field_wizard_dms_classification__template_id +msgid "Template" +msgstr "Mall" + +#. module: dms_auto_classification +#: model:ir.model.fields.selection,name:dms_auto_classification.selection__wizard_dms_classification_detail__state__to_classify +msgid "To classify" +msgstr "Att klassificera" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification +msgid "Wizard Dms Classification" +msgstr "Wizard Dms Klassificering" + +#. module: dms_auto_classification +#: model:ir.model,name:dms_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "Wizard Dms Klassificering Detalj" diff --git a/dms_auto_classification/models/__init__.py b/dms_auto_classification/models/__init__.py new file mode 100644 index 000000000..cb95092bf --- /dev/null +++ b/dms_auto_classification/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import dms_classification_template diff --git a/dms_auto_classification/models/dms_classification_template.py b/dms_auto_classification/models/dms_classification_template.py new file mode 100644 index 000000000..23ff91f03 --- /dev/null +++ b/dms_auto_classification/models/dms_classification_template.py @@ -0,0 +1,21 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class DmsClassificationTemplate(models.Model): + _name = "dms.classification.template" + _order = "sequence,name,id" + _description = "Dms Classification Template" + + name = fields.Char(required=True) + sequence = fields.Integer(required=True, default=10) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + store=True, + index=True, + ) + filename_pattern = fields.Char() + directory_pattern = fields.Char() diff --git a/dms_auto_classification/pyproject.toml b/dms_auto_classification/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/dms_auto_classification/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/dms_auto_classification/readme/CONFIGURE.md b/dms_auto_classification/readme/CONFIGURE.md new file mode 100644 index 000000000..a2f733cf8 --- /dev/null +++ b/dms_auto_classification/readme/CONFIGURE.md @@ -0,0 +1,11 @@ +1. Go to Documents / Configuration / Classification Templates and + create a new template. +2. You can set patterns (regex expressions) for filenames and + directories. + +Example of filename pattern to use only .txt files: .txt\$ Directory +pattern example 1: Documents Directory pattern example 1: Documents / +Data + +If the pattern doesn't contain path separators (/), the file name will +be search across all the subdirectories. diff --git a/dms_auto_classification/readme/CONTRIBUTORS.md b/dms_auto_classification/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5fee39042 --- /dev/null +++ b/dms_auto_classification/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/dms_auto_classification/readme/DESCRIPTION.md b/dms_auto_classification/readme/DESCRIPTION.md new file mode 100644 index 000000000..2a8faa89d --- /dev/null +++ b/dms_auto_classification/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Automatically classify files within a .zip file to the corresponding DMS +directory(s). diff --git a/dms_auto_classification/readme/USAGE.md b/dms_auto_classification/readme/USAGE.md new file mode 100644 index 000000000..25514718d --- /dev/null +++ b/dms_auto_classification/readme/USAGE.md @@ -0,0 +1,9 @@ +1. Go to Documents / Auto Classification and select a template and a + .zip file. +2. Press the Analyze button +3. As many lines will be set as the number of files contained in the + .zip file and apply the filename pattern. +4. The full path to the file will be displayed in each detail line. +5. Press the Classify button +6. The files (dms.file) will be created in the corresponding + directories. diff --git a/dms_auto_classification/security/ir.model.access.csv b/dms_auto_classification/security/ir.model.access.csv new file mode 100644 index 000000000..a15072901 --- /dev/null +++ b/dms_auto_classification/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_dms_classification_template_user,dms_classification_template_user,model_dms_classification_template,dms.group_dms_user,1,0,0,0 +access_dms_classification_template_manager,dms_classification_template_manager,model_dms_classification_template,dms.group_dms_manager,1,1,1,1 +access_wizard_dms_classification_manager,wizard_dms_classification_manager,model_wizard_dms_classification,dms.group_dms_user,1,1,1,1 +access_wizard_dms_classification_detail_manager,wizard_dms_classification_detail_manager,model_wizard_dms_classification_detail,dms.group_dms_user,1,1,1,1 diff --git a/dms_auto_classification/security/security.xml b/dms_auto_classification/security/security.xml new file mode 100644 index 000000000..a8332fbdd --- /dev/null +++ b/dms_auto_classification/security/security.xml @@ -0,0 +1,9 @@ + + + + DMS Classification Template multi-company + + + [('company_id', 'in', [False] + company_ids)] + + diff --git a/dms_auto_classification/static/description/icon.png b/dms_auto_classification/static/description/icon.png new file mode 100644 index 000000000..9fd5b327a Binary files /dev/null and b/dms_auto_classification/static/description/icon.png differ diff --git a/dms_auto_classification/static/description/icon.svg b/dms_auto_classification/static/description/icon.svg new file mode 100644 index 000000000..38e821a45 --- /dev/null +++ b/dms_auto_classification/static/description/icon.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms_auto_classification/static/description/index.html b/dms_auto_classification/static/description/index.html new file mode 100644 index 000000000..37e8b48e1 --- /dev/null +++ b/dms_auto_classification/static/description/index.html @@ -0,0 +1,460 @@ + + + + + +Auto classify documents into DMS + + + +
+

Auto classify documents into DMS

+ + +

Beta License: AGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

+

Automatically classify files within a .zip file to the corresponding DMS +directory(s).

+

Table of contents

+ +
+

Configuration

+
    +
  1. Go to Documents / Configuration / Classification Templates and create +a new template.
  2. +
  3. You can set patterns (regex expressions) for filenames and +directories.
  4. +
+

Example of filename pattern to use only .txt files: .txt$ Directory +pattern example 1: Documents Directory pattern example 1: Documents / +Data

+

If the pattern doesn’t contain path separators (/), the file name will +be search across all the subdirectories.

+
+
+

Usage

+
    +
  1. Go to Documents / Auto Classification and select a template and a +.zip file.
  2. +
  3. Press the Analyze button
  4. +
  5. As many lines will be set as the number of files contained in the +.zip file and apply the filename pattern.
  6. +
  7. The full path to the file will be displayed in each detail line.
  8. +
  9. Press the Classify button
  10. +
  11. The files (dms.file) will be created in the corresponding +directories.
  12. +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Tecnativa
  • +
+
+
+

Contributors

+
    +
  • Tecnativa:
      +
    • Víctor Martínez
    • +
    • Pedro M. Baeza
    • +
    +
  • +
+
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

victoralmau

+

This module is part of the OCA/dms project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/dms_auto_classification/tests/__init__.py b/dms_auto_classification/tests/__init__.py new file mode 100644 index 000000000..7ad1c277a --- /dev/null +++ b/dms_auto_classification/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from . import test_dms_auto_classification diff --git a/dms_auto_classification/tests/data/test.zip b/dms_auto_classification/tests/data/test.zip new file mode 100644 index 000000000..78f317a00 Binary files /dev/null and b/dms_auto_classification/tests/data/test.zip differ diff --git a/dms_auto_classification/tests/test_dms_auto_classification.py b/dms_auto_classification/tests/test_dms_auto_classification.py new file mode 100644 index 000000000..3d276d6c8 --- /dev/null +++ b/dms_auto_classification/tests/test_dms_auto_classification.py @@ -0,0 +1,192 @@ +# Copyright 2024-2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from base64 import b64encode +from os import path + +from odoo import Command +from odoo.tests import Form, new_test_user +from odoo.tests.common import users + +from odoo.addons.base.tests.common import BaseCommon + + +class TestDmsAutoClassification(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.template = cls.env.ref( + "dms_auto_classification.dms_classification_template_documents" + ) + cls.directory = cls.env.ref("dms.directory_01_demo") + cls.wizard = cls._create_wizard_dms_classification(cls.template) + cls.extra_wizard = cls._create_wizard_dms_classification(cls.template) + cls.user = new_test_user( + cls.env, login="test_dms_user", groups="dms.group_dms_user" + ) + access_group = cls.env["dms.access.group"].create( + { + "name": "Test access group", + "perm_create": True, + "perm_write": True, + "explicit_user_ids": [Command.set([cls.user.id])], + } + ) + cls.directory.group_ids = [Command.set([access_group.id])] + + @classmethod + def _data_file(cls, filename, encoding=None): + mode = "rt" if encoding else "rb" + with open(path.join(path.dirname(__file__), filename), mode) as file: + data = file.read() + if encoding: + data = data.encode(encoding) + return b64encode(data) + + @classmethod + def _create_wizard_dms_classification(cls, template): + wizard_form = Form(cls.env["wizard.dms.classification"]) + wizard_form.template_id = template + wizard_form.data_file = cls._data_file("data/test.zip") + return wizard_form.save() + + @users("test_dms_user") + def test_wizard_dms_clasification_process_01(self): + self.wizard = self.wizard.with_user(self.env.user) + self.assertEqual(self.wizard.state, "draft") + # Wizard - Analyze process + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 2) + full_paths = self.wizard.mapped("detail_ids.full_path") + self.assertIn("test/file-1.txt", full_paths) + self.assertIn("test/file-2.txt", full_paths) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("file-1.txt", file_names) + self.assertIn("file-2.txt", file_names) + self.assertIn(self.directory, self.wizard.mapped("detail_ids.directory_id")) + detail_1 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "file-1.txt" + ) + self.assertEqual(detail_1.state, "to_classify") + detail_2 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "file-2.txt" + ) + self.assertEqual(detail_2.state, "to_classify") + # Wizard - Classify process + res = self.wizard.action_classify() + dms_files = self.env[res["res_model"]].search(res["domain"]) + self.assertEqual(len(dms_files), 2) + self.assertEqual(detail_1.state, "classified") + self.assertEqual(detail_1.file_id.directory_id, self.directory) + self.assertEqual(detail_1.file_id.name, "file-1.txt") + self.assertTrue(detail_1.file_id.content) + self.assertEqual(detail_2.state, "classified") + self.assertEqual(detail_2.file_id.directory_id, self.directory) + self.assertEqual(detail_2.file_id.name, "file-2.txt") + self.assertTrue(detail_2.file_id.content) + # Extra wizard + self.assertEqual(self.extra_wizard.state, "draft") + # New Wizard - Analyze process + self.extra_wizard = self.extra_wizard.with_user(self.env.user) + self.extra_wizard.action_analyze() + self.assertEqual(self.extra_wizard.state, "analyze") + self.assertEqual(len(self.extra_wizard.detail_ids), 2) + file_names = self.extra_wizard.mapped("detail_ids.file_name") + self.assertIn("file-1.txt", file_names) + self.assertIn("file-2.txt", file_names) + self.assertIn( + self.directory, self.extra_wizard.mapped("detail_ids.directory_id") + ) + detail_1 = self.extra_wizard.detail_ids.filtered( + lambda x: x.file_name == "file-1.txt" + ) + self.assertTrue(detail_1.file_id) + self.assertEqual(detail_1.state, "classified") + detail_2 = self.extra_wizard.detail_ids.filtered( + lambda x: x.file_name == "file-2.txt" + ) + self.assertTrue(detail_2.file_id) + self.assertEqual(detail_1.state, "classified") + # New Wizard - Classify process + res = self.extra_wizard.action_classify() + dms_files = self.env[res["res_model"]].search(res["domain"]) + self.assertEqual(len(dms_files), 2) + + def test_wizard_dms_clasification_process_filename_pattern_01(self): + self.template.filename_pattern = ".pdf$" + self.assertEqual(self.wizard.state, "draft") + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 0) + + def test_wizard_dms_clasification_process_filename_pattern_02(self): + self.template.filename_pattern = "test2/.txt$" + self.assertEqual(self.wizard.state, "draft") + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 0) + + def test_wizard_dms_clasification_process_filename_pattern_03(self): + self.template.filename_pattern = "test.*.txt$" + self.assertEqual(self.wizard.state, "draft") + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 2) + full_paths = self.wizard.mapped("detail_ids.full_path") + self.assertIn("test/file-1.txt", full_paths) + self.assertIn("test/file-2.txt", full_paths) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("file-1.txt", file_names) + self.assertIn("file-2.txt", file_names) + + def test_wizard_dms_clasification_process_filename_pattern_04(self): + self.template.filename_pattern = "test1.*.txt$" + self.assertEqual(self.wizard.state, "draft") + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 0) + + def test_wizard_dms_clasification_process_filename_pattern_05(self): + self.template.filename_pattern = "test.*.file-1.txt$" + self.assertEqual(self.wizard.state, "draft") + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 1) + full_paths = self.wizard.mapped("detail_ids.full_path") + self.assertIn("test/file-1.txt", full_paths) + self.assertNotIn("test/file-2.txt", full_paths) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("file-1.txt", file_names) + self.assertNotIn("file-2.txt", file_names) + + @users("test_dms_user") + def test_wizard_dms_clasification_process_directory_pattern(self): + self.template.directory_pattern = "Documents2" + self.assertEqual(self.wizard.state, "draft") + # Analyze process + self.wizard = self.wizard.with_user(self.env.user) + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 2) + full_paths = self.wizard.mapped("detail_ids.full_path") + self.assertIn("test/file-1.txt", full_paths) + self.assertIn("test/file-2.txt", full_paths) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("file-1.txt", file_names) + self.assertIn("file-2.txt", file_names) + self.assertNotIn(self.directory, self.wizard.mapped("detail_ids.directory_id")) + detail_1 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "file-1.txt" + ) + self.assertEqual(detail_1.state, "to_classify") + detail_2 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "file-2.txt" + ) + self.assertEqual(detail_2.state, "to_classify") + # Classify process + res = self.wizard.action_classify() + dms_files = self.env[res["res_model"]].search(res["domain"]) + self.assertEqual(len(dms_files), 0) + self.assertFalse(detail_1.file_id) + self.assertFalse(detail_2.file_id) diff --git a/dms_auto_classification/views/dms_classification_template_views.xml b/dms_auto_classification/views/dms_classification_template_views.xml new file mode 100644 index 000000000..e090494f5 --- /dev/null +++ b/dms_auto_classification/views/dms_classification_template_views.xml @@ -0,0 +1,50 @@ + + + + + dms.classification.template + + + + + + + + + + + + dms.classification.template + +
+ +
+

+ +

+
+ + + + + +
+
+
+
+ + Classification Templates + dms.classification.template + list,form + + + +
diff --git a/dms_auto_classification/wizards/__init__.py b/dms_auto_classification/wizards/__init__.py new file mode 100644 index 000000000..4ba9cc23a --- /dev/null +++ b/dms_auto_classification/wizards/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import wizard_dms_classification diff --git a/dms_auto_classification/wizards/wizard_dms_classification.py b/dms_auto_classification/wizards/wizard_dms_classification.py new file mode 100644 index 000000000..03b71add5 --- /dev/null +++ b/dms_auto_classification/wizards/wizard_dms_classification.py @@ -0,0 +1,208 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) +import base64 +import re +import zipfile +from io import BytesIO + +from odoo import _, api, fields, models +from odoo.exceptions import UserError + + +class WizardDmsClassification(models.TransientModel): + _name = "wizard.dms.classification" + _description = "Wizard Dms Classification" + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("analyze", "Analyze"), + ], + default="draft", + ) + template_id = fields.Many2one( + comodel_name="dms.classification.template", + string="Template", + required=True, + ) + data_file = fields.Binary( + string="File", + required=True, + ) + data_filename = fields.Char() + detail_ids = fields.One2many( + comodel_name="wizard.dms.classification.detail", + inverse_name="parent_id", + string="Details", + ) + + def _is_zipfile(self): + try: + zipfile.ZipFile(BytesIO(base64.b64decode(self.data_file))) + return True + except (zipfile.BadZipFile, ValueError): + return False + + @api.onchange("data_file") + def _onchange_data_file(self): + for item in self.filtered("data_file"): + if not item._is_zipfile(): + raise UserError(_("Only .zip files are allowed")) + + def _return_item(self): + return { + "context": self.env.context, + "view_type": "form", + "view_mode": "form", + "res_model": self._name, + "res_id": self.id, + "view_id": False, + "type": "ir.actions.act_window", + "target": "new", + } + + def _get_directory_from_pattern(self, pattern, directories): + directory = False + for d in directories: + if re.search(pattern, d.complete_name): + directory = d + break + return directory + + def action_analyze(self): + """Process the zip file and generate details.""" + details = self._prepare_details_vals() + self.state = "analyze" + self.detail_ids = [(0, 0, vals) for vals in details] + return self._return_item() + + def _prepare_details_vals(self): + """Method that gets the files from .zip and if it apply the filename pattern + it will set it as detail with the corresponding values.""" + details = [] + zip_file = zipfile.ZipFile(BytesIO(base64.b64decode(self.data_file))) + filename_pattern = self.template_id.filename_pattern + for zip_info in zip_file.infolist(): + if zip_info.is_dir(): + continue + filename = zip_info.filename + if re.search(filename_pattern, filename): + file_content = zip_file.read(filename) + data_file = base64.b64encode(file_content) + details.append(self._prepare_detail_vals(filename, data_file)) + return details + + def _prepare_detail_vals(self, full_path, data_file): + """Method to set the values of each detail. May be extended by other modules. + Clean full_path (remove / from folders).""" + return { + "full_path": full_path, + "data_file": data_file, + } + + def _action_classify(self): + """Create the files (dms.file) in the corresponding directory. + Details that do not have a directory or already have a linked + file are skipped.""" + for detail in self.detail_ids.filtered( + lambda x: x.state == "to_classify" and x.directory_id + ): + detail._create_dms_file() + + def action_classify(self): + self._action_classify() + action = self.env["ir.actions.act_window"]._for_xml_id("dms.action_dms_file") + action["view_mode"] = "list" + action["views"] = [(False, "list")] + action["domain"] = [("id", "in", self.mapped("detail_ids.file_id").ids)] + return action + + +class WizardDmsClassificationDetail(models.TransientModel): + _name = "wizard.dms.classification.detail" + _description = "Wizard Dms Classification Detail" + + parent_id = fields.Many2one( + comodel_name="wizard.dms.classification", + string="Parent", + ) + full_path = fields.Char( + string="Full path", + required=True, + readonly=True, + ) + file_name = fields.Char( + compute="_compute_file_name", + store=True, + string="File name", + ) + data_file = fields.Binary( + string="File content", + required=True, + ) + directory_id = fields.Many2one( + comodel_name="dms.directory", + string="Directory", + compute="_compute_directory_id", + store=True, + readonly=False, + ) + file_id = fields.Many2one( + comodel_name="dms.file", + string="File", + compute="_compute_file_id", + store=True, + readonly=True, + ) + state = fields.Selection( + selection=[ + ("to_classify", "To classify"), + ("classified", "Classified"), + ], + compute="_compute_state", + store=True, + readonly=True, + ) + + @api.depends("full_path") + def _compute_file_name(self): + """File_name field is used to set file_id.""" + for item in self: + name = item.full_path + if "/" in name: + name = name.split("/")[-1] + item.file_name = name + + @api.depends("file_name") + def _compute_directory_id(self): + directories = self.env["dms.directory"].sudo().search([]) + for item in self: + item.directory_id = self.parent_id._get_directory_from_pattern( + self.parent_id.template_id.directory_pattern, directories + ) + + @api.depends("file_name", "directory_id", "parent_id.state") + def _compute_file_id(self): + for item in self.filtered(lambda x: x.file_name and x.directory_id): + files = item.directory_id.file_ids.filtered( + lambda x, item=item: x.name == item.file_name + ) + item.file_id = fields.first(files) + + @api.depends("file_id") + def _compute_state(self): + items_with_file = self.filtered("file_id") + items_with_file.state = "classified" + (self - items_with_file).state = "to_classify" + + def _create_dms_file(self): + self.ensure_one() + if not self.directory_id or self.file_id: + return + self.file_id = self.env["dms.file"].create( + { + "name": self.file_name, + "directory_id": self.directory_id.id, + "content": self.data_file, + } + ) diff --git a/dms_auto_classification/wizards/wizard_dms_classification_views.xml b/dms_auto_classification/wizards/wizard_dms_classification_views.xml new file mode 100644 index 000000000..4033a8dd2 --- /dev/null +++ b/dms_auto_classification/wizards/wizard_dms_classification_views.xml @@ -0,0 +1,69 @@ + + + + + wizard.dms.classification + +
+
+ +
+ + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + Auto Classification + wizard.dms.classification + form + new + + + +
diff --git a/dms_field/README.rst b/dms_field/README.rst new file mode 100644 index 000000000..5ef4df46f --- /dev/null +++ b/dms_field/README.rst @@ -0,0 +1,145 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +========= +DMS Field +========= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:e12b4df87fff45814b0fb8f9a4afd22170c9cd1b505784b17b38a0356497030d + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-LGPL--3-blue.png + :target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/dms_field + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-dms_field + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This addon creates a new kind of view and allows to define a folder +related to a record. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To use the embedded view in any module, the module must inherit from the +mixin dms.field.mixin (You have an example with res.partner in this +module). + +Once this is done, in the form view of the model we will have to add the +following: + +.. code:: xml + + + +In addition, it will be necessary to create an Embedded DMS template for +this model. + +1. *Go to Documents > Configuration > Embedded DMS templates* and create + a new record. +2. Set a storage, a model (res.partner for example) and the access + groups you want. +3. You can also use expressions in "Directory format name", for example: + {{object.name}} +4. Click on the "Documents" tab icon and a folder hierarchy will be + created. +5. You can set here the hierarchy of directories, subdirectories and + files you need, this hierarchy will be used as a base when creating a + new record (res.partner for example). + +Usage +===== + +1. Go to the form view of an existing partner and click on the "DMS" tab + icon, a hierarchy of folders and files linked to that record will be + created. +2. Create a new partner. A hierarchy of folders and files linked to that + record will be created. + +Known issues / Roadmap +====================== + +- Add drag & drop compatibility to the dms_tree mode +- Multiple selection support (e.g. cut several files and paste to + another folder). + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Creu Blanca + +Contributors +------------ + +- Enric Tobella + +- Jaime Arroyo + +- `Tecnativa `__: + + - Víctor Martínez + - Carlos Roca + +- `PyTech `__: + + - Simone Rubino simone.rubino@pytech.it + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-CarlosRoca13| image:: https://github.com/CarlosRoca13.png?size=40px + :target: https://github.com/CarlosRoca13 + :alt: CarlosRoca13 + +Current `maintainer `__: + +|maintainer-CarlosRoca13| + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/dms_field/__init__.py b/dms_field/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/dms_field/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/dms_field/__manifest__.py b/dms_field/__manifest__.py new file mode 100644 index 000000000..efaa3eb7a --- /dev/null +++ b/dms_field/__manifest__.py @@ -0,0 +1,30 @@ +# Copyright 2020 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +{ + "name": "DMS Field", + "summary": """ + Create DMS View and allow to use them inside a record""", + "version": "18.0.1.1.0", + "license": "LGPL-3", + "author": "Creu Blanca,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/dms", + "depends": ["dms"], + "data": [ + "views/dms_access_group_views.xml", + "views/dms_directory.xml", + "views/dms_field_template_views.xml", + "views/dms_storage.xml", + "security/ir.model.access.csv", + "security/security.xml", + "data/assets.xml", + ], + "assets": { + "web.assets_backend": [ + "dms_field/static/src/**/*", + ("remove", "dms_field/static/src/views/fields/x2many/x2many_field.xml"), + ], + }, + "demo": ["demo/partner_dms.xml"], + "maintainers": ["CarlosRoca13"], +} diff --git a/dms_field/data/assets.xml b/dms_field/data/assets.xml new file mode 100644 index 000000000..9ef5d26ff --- /dev/null +++ b/dms_field/data/assets.xml @@ -0,0 +1,12 @@ + + + + + DMS X2Many Field + web.assets_backend + dms_field/static/src/views/fields/x2many/x2many_field.xml + + + diff --git a/dms_field/demo/partner_dms.xml b/dms_field/demo/partner_dms.xml new file mode 100644 index 000000000..7979b54a1 --- /dev/null +++ b/dms_field/demo/partner_dms.xml @@ -0,0 +1,31 @@ + + + + res.partner.form + res.partner + + + + + + + + + + + Admin (dms_field module) + True + True + True + + + + Partner + + + + + diff --git a/dms_field/i18n/dms_field.pot b/dms_field/i18n/dms_field.pot new file mode 100644 index 000000000..2fe043dc2 --- /dev/null +++ b/dms_field/i18n/dms_field.pot @@ -0,0 +1,361 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_actions_act_window_view +msgid "Action Window View" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Actions" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Add Directory: " +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Add File: " +msgstr "" + +#. module: dms_field +#: model:dms.access.group,name:dms_field.access_group_demo +msgid "Admin (dms_field module)" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "Autogenerated group from %(model)s (%(name)s) #%(id)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__company_id +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__company_id +msgid "Company" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_res_partner +msgid "Contact" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Create File" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Create directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_date +msgid "Created on" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Cut" +msgstr "" + +#. module: dms_field +#: model_terms:ir.ui.view,arch_db:dms_field.view_partner_form +msgid "DMS" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_mixin__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_users__dms_directory_ids +msgid "DMS Directories" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields.selection,name:dms_field.selection__ir_actions_act_window_view__view_mode__dms_list +#: model:ir.model.fields.selection,name:dms_field.selection__ir_ui_view__type__dms_list +msgid "DMS Tree" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__dms_field_ref +msgid "DMS field reference" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Delete" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +msgid "Directories of this storage must be related to a record" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_directory +msgid "Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__directory_format_name +msgid "Directory format name" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_template +msgid "Dms Field Template" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.dms_storage_act_window +#: model:ir.ui.menu,name:dms_field.dms_storage_menu +#: model_terms:ir.ui.view,arch_db:dms_field.view_dms_field_template_form +msgid "Documents" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Download" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Elements:" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.action_dms_field_template +#: model:ir.ui.menu,name:dms_field.menu_dms_field_template +msgid "Embedded DMS templates" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_storage__field_template_ids +msgid "File templated ids" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Files:" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__group_ids +msgid "Groups" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__id +msgid "ID" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_mixin +msgid "Mixin to use DMS Field" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model_id +msgid "Model" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/ir_ui_view.py:0 +msgid "Model not found: %(model)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__name +msgid "Name" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Open" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Open: " +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__parent_directory_id +msgid "Parent directory" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Paste" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Preview" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Rename" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Size:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +msgid "Some directories are inconsistent with the storage models" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_storage +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__storage_id +msgid "Storage" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Subdirectories:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +msgid "There are directories not associated to a record" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is already a linked directory created." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is already a template created for this model." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_access_group.py:0 +msgid "There is already an access group created for this record." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is no template linked to this model" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +msgid "This record is already related in this storage" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__user_field_id +msgid "User field" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_ir_actions_act_window_view__view_mode +#: model:ir.model.fields,field_description:dms_field.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,help:dms_field.field_dms_field_template__directory_format_name +msgid "" +"You can set expressions to be used for the directory name,\n" +" e.g.: {{object.name}}" +msgstr "" diff --git a/dms_field/i18n/es.po b/dms_field/i18n/es.po new file mode 100644 index 000000000..1c4bcd92e --- /dev/null +++ b/dms_field/i18n/es.po @@ -0,0 +1,519 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-04-16 11:00+0000\n" +"PO-Revision-Date: 2024-04-16 13:01+0200\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_actions_act_window_view +msgid "Action Window View" +msgstr "Vista de la ventana de acción" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Actions" +msgstr "Acciones" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add Directory: " +msgstr "Añadir directorio: " + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add File: " +msgstr "Agregar archivo: " + +#. module: dms_field +#: model:dms.access.group,name:dms_field.access_group_demo +msgid "Admin (dms_field module)" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "An error occurred during the upload" +msgstr "Se ha producido un error durante la carga" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "Autogenerated group from %(model)s (%(name)s) #%(id)s" +msgstr "Grupo autogenerado desde %(model)s (%(name)s) #%(id)s" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__company_id +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__company_id +msgid "Company" +msgstr "Compañía" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_res_partner +msgid "Contact" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create File" +msgstr "Crear archivo" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create directory" +msgstr "Crear directorio" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Cut" +msgstr "Cortar" + +#. module: dms_field +#: model_terms:ir.ui.view,arch_db:dms_field.view_partner_form +msgid "DMS" +msgstr "DMS" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_mixin__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_users__dms_directory_ids +msgid "DMS Directories" +msgstr "Directorios DMS" + +#. module: dms_field +#: model:ir.model.fields.selection,name:dms_field.selection__ir_actions_act_window_view__view_mode__dms_list +#: model:ir.model.fields.selection,name:dms_field.selection__ir_ui_view__type__dms_list +msgid "DMS Tree" +msgstr "Árbol DMS" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__dms_field_ref +msgid "DMS field reference" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Delete" +msgstr "Borrar" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "Directories of this storage must be related to a record" +msgstr "" +"Los directorios de este almacenamiento deben estar relacionados con un " +"registro" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_directory +msgid "Directory" +msgstr "Directorio" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__directory_format_name +msgid "Directory format name" +msgstr "Formato de nombre del directorio" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__display_name +msgid "Display Name" +msgstr "Nombre a Mostrar" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_template +msgid "Dms Field Template" +msgstr "Plantilla de Campo Dms" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.dms_storage_act_window +#: model:ir.ui.menu,name:dms_field.dms_storage_menu +#: model_terms:ir.ui.view,arch_db:dms_field.view_dms_field_template_form +msgid "Documents" +msgstr "Documentos" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Download" +msgstr "Descargar" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Elements:" +msgstr "Elementos:" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.action_dms_field_template +#: model:ir.ui.menu,name:dms_field.menu_dms_field_template +msgid "Embedded DMS templates" +msgstr "Plantillas DMS embebidas" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_storage__field_template_ids +msgid "File templated ids" +msgstr "Fichero de identificadores plantillas" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Files:" +msgstr "Archivos:" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__group_ids +msgid "Groups" +msgstr "Grupos" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__id +msgid "ID" +msgstr "ID (identificación)" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_uid +msgid "Last Updated by" +msgstr "Última actualización por" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_mixin +msgid "Mixin to use DMS Field" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model_id +msgid "Model" +msgstr "Modelo" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model +msgid "Model name" +msgstr "Nombre de modelo" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/ir_ui_view.py:0 +#, python-format +msgid "Model not found: %(model)s" +msgstr "Modelo no encontrado: %(model)s" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__name +msgid "Name" +msgstr "Nombre" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Open" +msgstr "Abrir" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Open: " +msgstr "Abrir " + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Directorio parental" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__parent_directory_id +msgid "Parent directory" +msgstr "Carpeta padre" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Paste" +msgstr "Pegar" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Preview" +msgstr "Previsualizar" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Rename" +msgstr "Renombrar" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Size:" +msgstr "Tamaño:" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "Some directories are inconsistent with the storage models" +msgstr "" +"Algunos directorios tienen incompatibilidades con los modelos de " +"almacenamiento" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_storage +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__storage_id +msgid "Storage" +msgstr "Almacenamiento" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Subdirectories:" +msgstr "Subdirectorios:" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "There are directories not associated to a record" +msgstr "Hay directorios no asociados a un registro" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a linked directory created." +msgstr "Ya hay un directorio creado relacionado." + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a template created for this model." +msgstr "Ya hay una plantilla creada para este modelo." + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_access_group.py:0 +#, python-format +msgid "There is already an access group created for this record." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is no template linked to this model" +msgstr "No hay plantilla vinculada a este modelo" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "This record is already related in this storage" +msgstr "Este registro ya está relacionado en este almacenamiento" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__user_field_id +msgid "User field" +msgstr "Campo de usuario" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_ui_view +msgid "View" +msgstr "Vista" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_ir_actions_act_window_view__view_mode +#: model:ir.model.fields,field_description:dms_field.field_ir_ui_view__type +msgid "View Type" +msgstr "Tipo de vista" + +#. module: dms_field +#: model:ir.model.fields,help:dms_field.field_dms_field_template__directory_format_name +msgid "" +"You can set expressions to be used for the directory name,\n" +" e.g.: {{object.name}}" +msgstr "" +"Puede utilizar expresiones para definir el nombre del directorio,\n" +"\tejemplo: {{object.name}}" + +#, python-format +#~ msgid "A file with the same name already exists" +#~ msgstr "Ya existe un archivo con el mismo nombre" + +#~ msgid "Base" +#~ msgstr "Base/Fuente" + +#, python-format +#~ msgid "Action Buttons" +#~ msgstr "Botones de acción" + +#, python-format +#~ msgid "Close the selected node" +#~ msgstr "Cerrar el nodo seleccionado" + +#, python-format +#~ msgid "Context Menu" +#~ msgstr "Menú contextual" + +#, python-format +#~ msgid "Create" +#~ msgstr "Crear" + +#, python-format +#~ msgid "Drag and Drop" +#~ msgstr "Arrastrar y soltar" + +#, python-format +#~ msgid "END" +#~ msgstr "FIN" + +#, python-format +#~ msgid "Edit" +#~ msgstr "Editar" + +#, python-format +#~ msgid "Edit the selected node" +#~ msgstr "Editar el nodo seleccionado" + +#, python-format +#~ msgid "F2" +#~ msgstr "F2" + +#, python-format +#~ msgid "HOME" +#~ msgstr "CASA" + +#, python-format +#~ msgid "Jump to the bottom" +#~ msgstr "Saltar a la parte inferior" + +#, python-format +#~ msgid "Jump to the top" +#~ msgstr "Saltar a la parte superior" + +#, python-format +#~ msgid "Keyboard Shortcuts" +#~ msgstr "Métodos abreviados de teclado" + +#, python-format +#~ msgid "Move down one node" +#~ msgstr "Desplazarse un nodo hacia abajo" + +#, python-format +#~ msgid "Move up one node" +#~ msgstr "Desplazarse un nodo hacia arriba" + +#, python-format +#~ msgid "Open all nodes" +#~ msgstr "Abrir todos los nodos" + +#, python-format +#~ msgid "Open the selected node" +#~ msgstr "Abrir el nodo seleccionado" + +#, python-format +#~ msgid "Refresh" +#~ msgstr "Actualizar" + +#, python-format +#~ msgid "Show Help" +#~ msgstr "Mostrar ayuda" + +#, python-format +#~ msgid "" +#~ "The action button at the top of the view can be used to open,\n" +#~ " create, edit or delete a node." +#~ msgstr "" +#~ "El botón de acción en la parte superior de la vista se puede utilizar " +#~ "para abrir,\n" +#~ " crear, editar o eliminar un nodo." + +#, python-format +#~ msgid "" +#~ "You can change the structure by moving nodes. It is also possible\n" +#~ " to create new nodes by dragging files and even " +#~ "entire folder\n" +#~ " structures on the view." +#~ msgstr "" +#~ "Puede cambiar la estructura moviendo nodos. También es posible\n" +#~ " crear nuevos nodos arrastrando archivos e incluso " +#~ "estructuras de carpetas\n" +#~ " completas en la vista." + +#, python-format +#~ msgid "" +#~ "You can open a context menu by right-clicking on any node. This\n" +#~ " contains further options for interacting with the " +#~ "node." +#~ msgstr "" +#~ "Puede abrir un menú contextual haciendo clic con el botón derecho en " +#~ "cualquier nodo. Este\n" +#~ " contiene más opciones para interactuar con el " +#~ "nodo." diff --git a/dms_field/i18n/fr.po b/dms_field/i18n/fr.po new file mode 100644 index 000000000..be39b92b9 --- /dev/null +++ b/dms_field/i18n/fr.po @@ -0,0 +1,395 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_actions_act_window_view +msgid "Action Window View" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Actions" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add Directory: " +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add File: " +msgstr "" + +#. module: dms_field +#: model:dms.access.group,name:dms_field.access_group_demo +msgid "Admin (dms_field module)" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "Autogenerated group from %(model)s (%(name)s) #%(id)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__company_id +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__company_id +msgid "Company" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_res_partner +msgid "Contact" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create File" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_date +msgid "Created on" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Cut" +msgstr "" + +#. module: dms_field +#: model_terms:ir.ui.view,arch_db:dms_field.view_partner_form +msgid "DMS" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_mixin__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_users__dms_directory_ids +msgid "DMS Directories" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields.selection,name:dms_field.selection__ir_actions_act_window_view__view_mode__dms_list +#: model:ir.model.fields.selection,name:dms_field.selection__ir_ui_view__type__dms_list +msgid "DMS Tree" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__dms_field_ref +msgid "DMS field reference" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Delete" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "Directories of this storage must be related to a record" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_directory +msgid "Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__directory_format_name +msgid "Directory format name" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_template +msgid "Dms Field Template" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.dms_storage_act_window +#: model:ir.ui.menu,name:dms_field.dms_storage_menu +#: model_terms:ir.ui.view,arch_db:dms_field.view_dms_field_template_form +msgid "Documents" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Download" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Elements:" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.action_dms_field_template +#: model:ir.ui.menu,name:dms_field.menu_dms_field_template +msgid "Embedded DMS templates" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_storage__field_template_ids +msgid "File templated ids" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Files:" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__group_ids +msgid "Groups" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__id +msgid "ID" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template____last_update +msgid "Last Modified on" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_mixin +msgid "Mixin to use DMS Field" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model_id +msgid "Model" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/ir_ui_view.py:0 +#, python-format +msgid "Model not found: %(model)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__name +msgid "Name" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Open" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Open: " +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__parent_directory_id +msgid "Parent directory" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Paste" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Preview" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Rename" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Size:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "Some directories are inconsistent with the storage models" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_storage +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__storage_id +msgid "Storage" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Subdirectories:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "There are directories not associated to a record" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a linked directory created." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a template created for this model." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_access_group.py:0 +#, python-format +msgid "There is already an access group created for this record." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is no template linked to this model" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "This record is already related in this storage" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__user_field_id +msgid "User field" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_ir_actions_act_window_view__view_mode +#: model:ir.model.fields,field_description:dms_field.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,help:dms_field.field_dms_field_template__directory_format_name +msgid "" +"You can set expressions to be used for the directory name,\n" +" e.g.: {{object.name}}" +msgstr "" diff --git a/dms_field/i18n/it.po b/dms_field/i18n/it.po new file mode 100644 index 000000000..5cf56cf46 --- /dev/null +++ b/dms_field/i18n/it.po @@ -0,0 +1,586 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-11-26 20:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_actions_act_window_view +msgid "Action Window View" +msgstr "Vista maschera azione" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Actions" +msgstr "Azioni" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add Directory: " +msgstr "Aggiungi cartella: " + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Add File: " +msgstr "Aggiungi file: " + +#. module: dms_field +#: model:dms.access.group,name:dms_field.access_group_demo +msgid "Admin (dms_field module)" +msgstr "Amministratore (modulo dms_field)" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "An error occurred during the upload" +msgstr "Si è verificato un errore durante il caricamento" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "Autogenerated group from %(model)s (%(name)s) #%(id)s" +msgstr "Gruppo autogenerato da %(model)s (%(name)s) n°%(id)s" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__company_id +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__company_id +msgid "Company" +msgstr "Azienda" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create File" +msgstr "Crea file" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Create directory" +msgstr "Crea cartella" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Cut" +msgstr "Taglia" + +#. module: dms_field +#: model_terms:ir.ui.view,arch_db:dms_field.view_partner_form +msgid "DMS" +msgstr "DMS" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_mixin__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_users__dms_directory_ids +msgid "DMS Directories" +msgstr "Cartelle DMS" + +#. module: dms_field +#: model:ir.model.fields.selection,name:dms_field.selection__ir_actions_act_window_view__view_mode__dms_list +#: model:ir.model.fields.selection,name:dms_field.selection__ir_ui_view__type__dms_list +msgid "DMS Tree" +msgstr "Albero DMS" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__dms_field_ref +msgid "DMS field reference" +msgstr "Riferimento campo DMS" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Delete" +msgstr "Elimina" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "Directories of this storage must be related to a record" +msgstr "Le cartelle di questo storage devono essere collegate ad un record" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_directory +msgid "Directory" +msgstr "Cartella" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__directory_format_name +msgid "Directory format name" +msgstr "Nome formato cartella" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_template +msgid "Dms Field Template" +msgstr "Modello campo DMS" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.dms_storage_act_window +#: model:ir.ui.menu,name:dms_field.dms_storage_menu +#: model_terms:ir.ui.view,arch_db:dms_field.view_dms_field_template_form +msgid "Documents" +msgstr "Documenti" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Download" +msgstr "Scarica" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Elements:" +msgstr "Elementi:" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.action_dms_field_template +#: model:ir.ui.menu,name:dms_field.menu_dms_field_template +msgid "Embedded DMS templates" +msgstr "Modelli DMS incorporati" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_storage__field_template_ids +msgid "File templated ids" +msgstr "ID file modelli" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Files:" +msgstr "File:" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__group_ids +msgid "Groups" +msgstr "Gruppi" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__id +msgid "ID" +msgstr "ID" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_mixin +msgid "Mixin to use DMS Field" +msgstr "Mixin per utilizzo campo DMS" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model_id +msgid "Model" +msgstr "Modello" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model +msgid "Model name" +msgstr "Nome modello" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/ir_ui_view.py:0 +#, python-format +msgid "Model not found: %(model)s" +msgstr "Modello non trovato: %(model)s" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__name +msgid "Name" +msgstr "Nome" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Open" +msgstr "Apri" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Open: " +msgstr "Apri: " + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "Cartella padre" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__parent_directory_id +msgid "Parent directory" +msgstr "Cartella padre" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Paste" +msgstr "Incolla" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Preview" +msgstr "Anteprima" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_access_group +msgid "Record Access Groups" +msgstr "Gruppi di accesso al record" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#, python-format +msgid "Rename" +msgstr "Rinomina" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Size:" +msgstr "Dimensione:" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "Some directories are inconsistent with the storage models" +msgstr "Alcune cartelle non sono coerenti con i modelli dello storage" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_storage +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__storage_id +msgid "Storage" +msgstr "Deposito" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +#, python-format +msgid "Subdirectories:" +msgstr "Sottocartelle:" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +#, python-format +msgid "There are directories not associated to a record" +msgstr "Sono presenti cartelle non associate ad un record" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a linked directory created." +msgstr "Esiste già una cartella collegata." + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is already a template created for this model." +msgstr "Esiste già uno schema creato per questo modello." + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_access_group.py:0 +#, python-format +msgid "There is already an access group created for this record." +msgstr "Esiste già un gruppo di accesso creato per questo record." + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +#, python-format +msgid "There is no template linked to this model" +msgstr "Non c'è uno schema collegato a questo modello" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +#, python-format +msgid "This record is already related in this storage" +msgstr "Questo record è già correlato a questo storage" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__user_field_id +msgid "User field" +msgstr "Campo utente" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_ui_view +msgid "View" +msgstr "Vista" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_ir_actions_act_window_view__view_mode +#: model:ir.model.fields,field_description:dms_field.field_ir_ui_view__type +msgid "View Type" +msgstr "Tipo vista" + +#. module: dms_field +#: model:ir.model.fields,help:dms_field.field_dms_field_template__directory_format_name +msgid "" +"You can set expressions to be used for the directory name,\n" +" e.g.: {{object.name}}" +msgstr "" +"Si possono impostare espressioni da utilizzare per il nome della cartella,\n" +" es.: {{object.name}}" + +#, python-format +#~ msgid "Action Buttons" +#~ msgstr "Pulsanti azione" + +#~ msgid "Base" +#~ msgstr "Base" + +#, python-format +#~ msgid "Close the selected node" +#~ msgstr "Chiudi il nodo selezionato" + +#, python-format +#~ msgid "Context Menu" +#~ msgstr "Menù contestuale" + +#, python-format +#~ msgid "Create" +#~ msgstr "Crea" + +#, python-format +#~ msgid "Directory %s must be root in order to be related to a record" +#~ msgstr "La cartella %s deve essere radice per essere collegata ad un record" + +#, python-format +#~ msgid "Drag and Drop" +#~ msgstr "Tascina e rilascia" + +#, python-format +#~ msgid "END" +#~ msgstr "FINE" + +#, python-format +#~ msgid "Edit" +#~ msgstr "Modifica" + +#, python-format +#~ msgid "Edit the selected node" +#~ msgstr "Modifica il nodo selezionato" + +#, python-format +#~ msgid "F2" +#~ msgstr "F2" + +#, python-format +#~ msgid "HOME" +#~ msgstr "HOME" + +#, python-format +#~ msgid "Jump to the bottom" +#~ msgstr "Salta fino in fondo" + +#, python-format +#~ msgid "Jump to the top" +#~ msgstr "Salta in cima" + +#, python-format +#~ msgid "Keyboard Shortcuts" +#~ msgstr "Scorciatoie tastiera" + +#, python-format +#~ msgid "Move down one node" +#~ msgstr "Scendi di un nodo" + +#, python-format +#~ msgid "Move up one node" +#~ msgstr "Sali di un nodo" + +#, python-format +#~ msgid "Open all nodes" +#~ msgstr "Apri tutti i nodi" + +#, python-format +#~ msgid "Open the selected node" +#~ msgstr "Apri il nodo selezionato" + +#, python-format +#~ msgid "Refresh" +#~ msgstr "Aggiorna" + +#, python-format +#~ msgid "Show Help" +#~ msgstr "Mostra aiuto" + +#, python-format +#~ msgid "" +#~ "The action button at the top of the view can be used to open,\n" +#~ " create, edit or delete a node." +#~ msgstr "" +#~ "Il pulsante azione nella parte superiore della vista può essere " +#~ "utilizzato per aprire,\n" +#~ " creare, modificare o eliminare un nodo." + +#, python-format +#~ msgid "" +#~ "You can change the structure by moving nodes. It is also possible\n" +#~ " to create new nodes by dragging files and even " +#~ "entire folder\n" +#~ " structures on the view." +#~ msgstr "" +#~ "Puoi cambiare la struttura spostando i nodi. È anche possibile\n" +#~ " creare nuovi nodi trascinando file e anche " +#~ "intere strutture\n" +#~ " di cartelle nella vista." + +#, python-format +#~ msgid "" +#~ "You can open a context menu by right-clicking on any node. This\n" +#~ " contains further options for interacting with the " +#~ "node." +#~ msgstr "" +#~ "È possibile aprire un menu contestuale facendo clic con il tasto destro " +#~ "su qualsiasi nodo. Questo\n" +#~ " contiene ulteriori opzioni per interagire con il " +#~ "nodo." + +#~ msgid "Add Directory to a DMS Record" +#~ msgstr "Aggiungi cartella a un record DMS" + +#, python-format +#~ msgid "Add new root directory" +#~ msgstr "Aggiungi una nuova cartella radice" + +#, python-format +#~ msgid "Create:" +#~ msgstr "Crea:" + +#, python-format +#~ msgid "Delete:" +#~ msgstr "Elimina:" + +#~ msgid "Dms Add Directory Record" +#~ msgstr "Aggiungi record cartella DMS" + +#~ msgid "Everyone for Partner DMS" +#~ msgstr "Tutti per il DMS del partner" + +#~ msgid "Field Default Group" +#~ msgstr "Campo gruppo predefinito" + +#, python-format +#~ msgid "Name:" +#~ msgstr "Nome:" + +#~ msgid "Possible storages" +#~ msgstr "Storage possibili" + +#, python-format +#~ msgid "Preview/download" +#~ msgstr "Anteprima/download" + +#, python-format +#~ msgid "Read:" +#~ msgstr "Leggi:" + +#~ msgid "Res" +#~ msgstr "Res" + +#~ msgid "Res Model" +#~ msgstr "Modello res" + +#, python-format +#~ msgid "" +#~ "Storage %s should need to be assigned to a model in order to relate the " +#~ "directory to a record" +#~ msgstr "" +#~ "Dovrebbe essere necessario assegnare lo storage %s a un modello per " +#~ "correlare la cartella a un record" + +#, python-format +#~ msgid "" +#~ "Storage %s should need to be assigned to a model related to the storage" +#~ msgstr "" +#~ "Dovrebbe essere necessario assegnare lo storage %s a un modello correlato " +#~ "allo storage" + +#, python-format +#~ msgid "Write:" +#~ msgstr "Scrivi:" + +#, python-format +#~ msgid "no" +#~ msgstr "no" + +#, python-format +#~ msgid "yes" +#~ msgstr "si" diff --git a/dms_field/i18n/sv.po b/dms_field/i18n/sv.po new file mode 100644 index 000000000..beb645e04 --- /dev/null +++ b/dms_field/i18n/sv.po @@ -0,0 +1,362 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_actions_act_window_view +msgid "Action Window View" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Actions" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Add Directory: " +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Add File: " +msgstr "" + +#. module: dms_field +#: model:dms.access.group,name:dms_field.access_group_demo +msgid "Admin (dms_field module)" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "An error occurred during the upload" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "Autogenerated group from %(model)s (%(name)s) #%(id)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__company_id +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__company_id +msgid "Company" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_res_partner +msgid "Contact" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Create File" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Create directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__create_date +msgid "Created on" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Cut" +msgstr "" + +#. module: dms_field +#: model_terms:ir.ui.view,arch_db:dms_field.view_partner_form +msgid "DMS" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_mixin__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_partner__dms_directory_ids +#: model:ir.model.fields,field_description:dms_field.field_res_users__dms_directory_ids +msgid "DMS Directories" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields.selection,name:dms_field.selection__ir_actions_act_window_view__view_mode__dms_list +#: model:ir.model.fields.selection,name:dms_field.selection__ir_ui_view__type__dms_list +msgid "DMS Tree" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_access_group__dms_field_ref +msgid "DMS field reference" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Delete" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +msgid "Directories of this storage must be related to a record" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_directory +msgid "Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__directory_format_name +msgid "Directory format name" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_template +msgid "Dms Field Template" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.dms_storage_act_window +#: model:ir.ui.menu,name:dms_field.dms_storage_menu +#: model_terms:ir.ui.view,arch_db:dms_field.view_dms_field_template_form +msgid "Documents" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Download" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Elements:" +msgstr "" + +#. module: dms_field +#: model:ir.actions.act_window,name:dms_field.action_dms_field_template +#: model:ir.ui.menu,name:dms_field.menu_dms_field_template +msgid "Embedded DMS templates" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_storage__field_template_ids +msgid "File templated ids" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Files:" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__group_ids +msgid "Groups" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__id +msgid "ID" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_field_mixin +msgid "Mixin to use DMS Field" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model_id +msgid "Model" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/ir_ui_view.py:0 +msgid "Model not found: %(model)s" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__name +msgid "Name" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Open" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Open: " +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_directory__parent_id +msgid "Parent Directory" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__parent_directory_id +msgid "Parent directory" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Paste" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Preview" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js:0 +msgid "Rename" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Size:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +msgid "Some directories are inconsistent with the storage models" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_dms_storage +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__storage_id +msgid "Storage" +msgstr "" + +#. module: dms_field +#. odoo-javascript +#: code:addons/dms_field/static/src/views/dms_list/dms_list_renderer.xml:0 +msgid "Subdirectories:" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_storage.py:0 +msgid "There are directories not associated to a record" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is already a linked directory created." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is already a template created for this model." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_access_group.py:0 +msgid "There is already an access group created for this record." +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_field_template.py:0 +msgid "There is no template linked to this model" +msgstr "" + +#. module: dms_field +#. odoo-python +#: code:addons/dms_field/models/dms_directory.py:0 +msgid "This record is already related in this storage" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_dms_field_template__user_field_id +msgid "User field" +msgstr "" + +#. module: dms_field +#: model:ir.model,name:dms_field.model_ir_ui_view +msgid "View" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,field_description:dms_field.field_ir_actions_act_window_view__view_mode +#: model:ir.model.fields,field_description:dms_field.field_ir_ui_view__type +msgid "View Type" +msgstr "" + +#. module: dms_field +#: model:ir.model.fields,help:dms_field.field_dms_field_template__directory_format_name +msgid "" +"You can set expressions to be used for the directory name,\n" +" e.g.: {{object.name}}" +msgstr "" diff --git a/dms_field/models/__init__.py b/dms_field/models/__init__.py new file mode 100644 index 000000000..9ebe2fdc7 --- /dev/null +++ b/dms_field/models/__init__.py @@ -0,0 +1,8 @@ +from . import dms_field_mixin +from . import ir_actions_act_window_view +from . import ir_ui_view +from . import dms_access_group +from . import dms_storage +from . import dms_directory +from . import dms_field_template +from . import res_partner diff --git a/dms_field/models/dms_access_group.py b/dms_field/models/dms_access_group.py new file mode 100644 index 000000000..f7188b5a4 --- /dev/null +++ b/dms_field/models/dms_access_group.py @@ -0,0 +1,65 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# Copyright 2025 Simone Rubino - PyTech +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, api, fields, models +from odoo.exceptions import UserError +from odoo.osv import expression + + +class DmsAccessGroups(models.Model): + _inherit = "dms.access.group" + + dms_field_ref = fields.Reference( + selection="_selection_reference_value", + string="DMS field reference", + ) + company_id = fields.Many2one( + compute="_compute_company_id", + comodel_name="res.company", + string="Company", + store=True, + ) + + @api.model + def _selection_reference_value(self): + models = ( + self.env["ir.model"] + .sudo() + .search([("transient", "=", False)], order="name asc") + ) + return [(model.model, model.name) for model in models] + + @api.depends("dms_field_ref") + def _compute_company_id(self): + self.company_id = False + for item in self.filtered("dms_field_ref"): + item.company_id = ( + item.dms_field_ref.company_id + if "company_id" in item.dms_field_ref._fields + else False + ) + + def _get_domain_for_item_from_dms_field_ref(self, record): + return [ + ("dms_field_ref", "=", f"{record._name},{record.id}"), + ] + + def _get_item_from_dms_field_ref(self, record): + return self.env["dms.access.group"].search( + self._get_domain_for_item_from_dms_field_ref(record) + ) + + @api.constrains("dms_field_ref") + def _check_dms_field_ref(self): + for item in self.filtered("dms_field_ref"): + domain = expression.AND( + [ + item._get_domain_for_item_from_dms_field_ref(item.dms_field_ref), + [("id", "!=", item.id)], + ] + ) + if self.search(domain): + raise UserError( + _("There is already an access group created for this record.") + ) diff --git a/dms_field/models/dms_directory.py b/dms_field/models/dms_directory.py new file mode 100644 index 000000000..a24c03d95 --- /dev/null +++ b/dms_field/models/dms_directory.py @@ -0,0 +1,165 @@ +# Copyright 2020 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.osv import expression + + +class DmsDirectory(models.Model): + _inherit = "dms.directory" + + parent_id = fields.Many2one(default=lambda self: self._default_parent()) + + @api.model + def _default_parent(self): + return self.env.context.get("default_parent_directory_id", False) + + @api.constrains("res_id", "is_root_directory", "storage_id", "res_model") + def _check_resource(self): + for directory in self: + if directory.storage_id.save_type == "attachment": + continue + if ( + directory.is_root_directory + and directory.storage_id.model_ids + and not directory.res_id + ): + raise ValidationError( + _("Directories of this storage must be related to a record") + ) + if not directory.res_id: + continue + if self.search( + [ + ("storage_id", "=", directory.storage_id.id), + ("id", "!=", directory.id), + ("res_id", "=", directory.res_id), + ("res_model", "=", directory.res_model), + ], + limit=1, + ): + raise ValidationError( + _("This record is already related in this storage") + ) + + @api.model + def _build_documents_view_directory(self, directory): + return { + "id": f"directory_{directory.id}", + "text": directory.name, + "icon": "fa fa-folder-o", + "type": "directory", + "data": {"odoo_id": directory.id, "odoo_model": "dms.directory"}, + "children": directory.count_elements > 0, + } + + @api.model + def _check_parent_field(self): + if self._parent_name not in self._fields: + raise TypeError(f"The parent ({self._parent_name}) field does not exist.") + + @api.model + def search_read_parents( + self, domain=False, fields=None, offset=0, limit=None, order=None + ): + """This method finds the top level elements of the hierarchy + for a given search query. + + :param domain: a search domain (default: empty list) + :param fields: a list of fields to read (default: all fields of the model) + :param offset: the number of results to ignore (default: none) + :param limit: maximum number of records to return (default: all) + :param order: a string to define the sort order of the query + (default: none) + :returns: the top level elements for the given search query + """ + if not domain: + domain = [] + records = self.search_parents( + domain=domain, offset=offset, limit=limit, order=order + ) + if not records: + return [] + if fields and fields == ["id"]: + return [{"id": record.id} for record in records] + result = records.read(fields) + if len(result) <= 1: + return result + index = {vals["id"]: vals for vals in result} + return [index[record.id] for record in records if record.id in index] + + @api.model + def search_parents( + self, domain=False, offset=0, limit=None, order=None, count=False + ): + """This method finds the top level elements of the + hierarchy for a given search query. + + :param domain: a search domain (default: empty list) + :param offset: the number of results to ignore (default: none) + :param limit: maximum number of records to return (default: all) + :param order: a string to define the sort order of the query + (default: none) + :param count: counts and returns the number of matching records + (default: False) + :returns: the top level elements for the given search query + """ + if not domain: + domain = [] + res = self._search_parents( + domain=domain, offset=offset, limit=limit, order=order, count=count + ) + return res if count else self.browse(res) + + @api.model + def _search_parents( + self, domain=False, offset=0, limit=None, order=None, count=False + ): + if not domain: + domain = [] + self._check_parent_field() + self.check_access("read") + if expression.is_false(self, domain): + return [] + query = self._where_calc(domain) + self._apply_ir_rules(query, "read") + from_clause, from_params = query.from_clause + where_clause, where_clause_arguments = query.where_clause + parent_where = where_clause and (f" WHERE {where_clause}") or "" + parent_query = f'SELECT "{self._table}".id FROM ' + from_clause + parent_where + no_parent_clause = f'"{self._table}"."{self._parent_name}" IS NULL' + no_access_clause = ( + f'"{self._table}"."{self._parent_name}" NOT IN ({parent_query})' + ) + parent_clause = f"({no_parent_clause} OR {no_access_clause})" + order_by = f" ORDER BY {self._order_to_sql(order, self._where_calc([])).code}" + where_clause_params = where_clause_arguments + where_str = ( + where_clause + and (f" WHERE {where_clause} AND {parent_clause}") + or (f" WHERE {parent_clause}") + ) + if count: + # pylint: disable=sql-injection + query_str = "SELECT count(1) FROM " + from_clause + where_str + self._cr.execute(query_str, where_clause_params) + return self._cr.fetchone()[0] + limit_str = limit and " limit %s" or "" + offset_str = offset and " offset %s" or "" + query_str = ( + f'SELECT "{self._table}".id FROM ' + + from_clause + + where_str + + order_by + + limit_str + + offset_str + ) + complete_where_clause_params = where_clause_params + where_clause_arguments + if limit: + complete_where_clause_params.append(limit) + if offset: + complete_where_clause_params.append(offset) + # pylint: disable=sql-injection + self._cr.execute(query_str, complete_where_clause_params) + return list({x[0] for x in self._cr.fetchall()}) diff --git a/dms_field/models/dms_field_mixin.py b/dms_field/models/dms_field_mixin.py new file mode 100644 index 000000000..ec0ec8ae6 --- /dev/null +++ b/dms_field/models/dms_field_mixin.py @@ -0,0 +1,80 @@ +# Copyright 2020 Creu Blanca +# Copyright 2024 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import api, fields, models +from odoo.tools import config + + +class DMSFieldMixin(models.AbstractModel): + _name = "dms.field.mixin" + _description = "Mixin to use DMS Field" + + dms_directory_ids = fields.One2many( + "dms.directory", + "res_id", + string="DMS Directories", + domain=lambda self: [ + ("res_model", "=", self._name), + ("storage_id.save_type", "!=", "attachment"), + ], + auto_join=True, + ) + + @api.model + def models_to_track_dms_field_template(self): + """Models to be tracked for dms field templates + :args: + :returns: list of models + """ + return self.env["dms.field.template"].sudo().search([]).mapped("model_id.model") + + @api.model_create_multi + def create(self, vals_list): + """Create a dms directory when creating the record if exist a template. + We need to avoid applying a template except when testing functionality + with dms_field* modules to avoid the error that a directory with the same + name already exists (example: create partner). + """ + result = super().create(vals_list) + test_condition = not config["test_enable"] or self.env.context.get( + "test_dms_field" + ) + if ( + test_condition + and not self.env.context.get("skip_track_dms_field_template") + and self._name in self.models_to_track_dms_field_template() + ): + template = self.env["dms.field.template"].with_context(res_model=self._name) + for item in result: + template.with_context(res_id=item.id).create_dms_directory() + return result + + def write(self, vals): + """When modifying a record that has linked directories and changing the + user_id field it is necessary to update the auto-generated access group + (name and explicit_user_ids). + """ + res = super().write(vals) + # Apply sudo() in case the user does not have access to the directory + for item in self.sudo().filtered("dms_directory_ids"): + if "user_id" in vals: + template = self.env["dms.field.template"]._get_template_from_model( + item._name + ) + if template: + template.sudo()._get_autogenerated_group(item) + return res + + def unlink(self): + """When deleting a record, we also delete the linked directories and the + auto-generated access group. + """ + # Apply sudo() in case the user does not have access to the directory + for record in self.sudo().filtered("dms_directory_ids"): + group = ( + self.env["dms.access.group"].sudo()._get_item_from_dms_field_ref(record) + ) + record.sudo().dms_directory_ids.unlink() + group.unlink() + return super().unlink() diff --git a/dms_field/models/dms_field_template.py b/dms_field/models/dms_field_template.py new file mode 100644 index 000000000..a155a85dc --- /dev/null +++ b/dms_field/models/dms_field_template.py @@ -0,0 +1,216 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# Copyright 2025 Simone Rubino - PyTech +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError + + +class DmsFieldTemplate(models.Model): + _name = "dms.field.template" + _inherit = "dms.field.mixin" + _description = "Dms Field Template" + + name = fields.Char(required=True) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + store=True, + index=True, + ) + storage_id = fields.Many2one( + comodel_name="dms.storage", + domain=[("save_type", "!=", "attachment")], + string="Storage", + ) + parent_directory_id = fields.Many2one( + comodel_name="dms.directory", + domain="[('storage_id', '=', storage_id)]", + string="Parent directory", + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Model", + domain=[("transient", "=", False), ("model", "!=", "dms.field.template")], + index=True, + ) + model = fields.Char( + compute="_compute_model", compute_sudo=True, store=True, string="Model name" + ) + group_ids = fields.Many2many( + comodel_name="dms.access.group", + string="Groups", + ) + user_field_id = fields.Many2one( + comodel_name="ir.model.fields", + domain="[('model_id', '=', model_id),('relation', '=', 'res.users')]", + string="User field", + ) + directory_format_name = fields.Char( + string="Directory format name", + default="{{object.display_name}}", + help="""You can set expressions to be used for the directory name, + e.g.: {{object.name}}""", + ) + + @api.depends("model_id") + def _compute_model(self): + for item in self: + item.model = item.model_id.model + + def _get_template_from_model(self, model): + return self.search([("model", "=", model)], limit=1) + + @api.model_create_multi + def create(self, vals_list): + """Create dms directory automatically in the creation in install mode.""" + result = super().create(vals_list) + if self.env.context.get("install_mode"): + for item in result: + item_ctx = item.with_context(res_model=item._name, res_id=item.id) + item_ctx.create_dms_directory() + return result + + @api.model + def create_dms_directory(self): + """According to the model, create the directory linked to that record + and the subdirectories.""" + res_model = self.env.context.get("res_model") + res_id = self.env.context.get("res_id") + record = self.env[res_model].browse(res_id) + directory_model = self.env["dms.directory"].sudo() + if res_model == "dms.field.template": + return directory_model.create( + { + "storage_id": record.storage_id.id, + "res_id": record.id, + "res_model": record._name, + "is_root_directory": True, + "name": record.display_name, + "group_ids": record.group_ids.ids, + } + ) + template = self._get_template_from_model(res_model).sudo() + if not template: + raise ValidationError(_("There is no template linked to this model")) + total_directories = directory_model.search_count( + [ + ("parent_id", "=", self.parent_directory_id.id), + ("res_model", "=", res_model), + ("res_id", "=", res_id), + ] + ) + if total_directories > 0: + raise ValidationError(_("There is already a linked directory created.")) + # Create root directory + files + dms_directory_ids = template.dms_directory_ids + new_directory = directory_model.create( + template._prepare_directory_vals(dms_directory_ids, record) + ) + self._copy_files_from_directory(dms_directory_ids, new_directory) + # Create child directories + self._create_child_directories(new_directory, dms_directory_ids) + return new_directory + + def _copy_files_from_directory(self, directory, new_directory): + for file in directory.file_ids: + file.copy({"directory_id": new_directory.id}) + + def _prepare_autogenerated_group(self, record): + group_name = _("Autogenerated group from %(model)s (%(name)s) #%(id)s") % { + "model": record._description, + "name": record.display_name, + "id": record.id, + } + vals = { + "name": group_name, + # We need to set all the permissions so that the user can manage their + # documents (directories and files) + "perm_create": True, + "perm_write": True, + "perm_unlink": True, + "dms_field_ref": f"{record._name},{record.id}", + "explicit_user_ids": [(5, 0)], + } + # Apply sudo() because the user may not have permissions to access + # ir.model.fields. + user_field = self.sudo().user_field_id + if user_field: + user = record[user_field.name] + if user: + vals["explicit_user_ids"] += [(4, user.id)] + return vals + + def _get_autogenerated_group(self, record): + """Get the existing auto-generated group or create a new one. + The permissions of the auto-generated group should be changed + to make sure you have the correct data. + """ + group_model = self.env["dms.access.group"] + group_ref = group_model._get_item_from_dms_field_ref(record) + if group_ref: + group_ref.write(self._prepare_autogenerated_group(record)) + return group_ref + # Create the autogenerated group linked to the record + return group_model.create(self._prepare_autogenerated_group(record)) + + def _prepare_child_directory_vals(self, parent, template_child_directory): + """Values to create child directories on the record. + + :param parent: Directory already created from the template for the record + :param template_child_directory: Directory in the template directories structure + """ + return { + "name": template_child_directory.name, + "is_root_directory": False, + "parent_id": parent.id, + "inherit_group_ids": template_child_directory.inherit_group_ids, + "group_ids": [ + fields.Command.link(group.id) + for group in template_child_directory.group_ids + ], + } + + def _create_child_directories(self, parent, directory): + # Create child directories (all leves) + files + directory_model = self.env["dms.directory"].sudo() + for child_directory in directory.child_directory_ids: + child = directory_model.create( + self._prepare_child_directory_vals(parent, child_directory) + ) + self._copy_files_from_directory(child_directory, child) + self._create_child_directories(child, child_directory) + + def _prepare_directory_vals(self, directory, record): + # Groups of the new directory will be those of the template + auto-generate + groups = directory.group_ids + groups += self._get_autogenerated_group(record) + directory_name = self.env["mail.render.mixin"]._render_template( + self.directory_format_name, + record._name, + record.ids, + engine="inline_template", + )[record.id] + vals = { + "storage_id": directory.storage_id.id, + "res_id": record.id, + "res_model": record._name, + "name": directory_name, + "group_ids": [(4, group.id) for group in groups], + } + if not self.parent_directory_id: + vals.update({"is_root_directory": True}) + else: + vals.update( + {"parent_id": self.parent_directory_id.id, "inherit_group_ids": False} + ) + return vals + + @api.constrains("model_id") + def _check_model_id(self): + for template in self: + if self.env["dms.field.template"].search( + [("model_id", "=", template.model_id.id), ("id", "!=", template.id)] + ): + raise UserError( + _("There is already a template created for this model.") + ) diff --git a/dms_field/models/dms_storage.py b/dms_field/models/dms_storage.py new file mode 100644 index 000000000..0f8ab57ef --- /dev/null +++ b/dms_field/models/dms_storage.py @@ -0,0 +1,66 @@ +# Copyright 2020 Creu Blanca +# Copyright 2024 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class DmsStorage(models.Model): + _inherit = "dms.storage" + + field_template_ids = fields.One2many( + comodel_name="dms.field.template", + inverse_name="storage_id", + string="File templated ids", + ) + + @api.model + def _build_documents_storage(self, storage): + storage_directories = [] + model = self.env["dms.directory"] + directories = model.search_parents([["storage_id", "=", storage.id]]) + for record in directories: + storage_directories.append(model._build_documents_view_directory(record)) + return { + "id": f"storage_{storage.id}", + "text": storage.name, + "icon": "fa fa-database", + "type": "storage", + "data": {"odoo_id": storage.id, "odoo_model": "dms.storage"}, + "children": storage_directories, + } + + @api.model + def get_js_tree_data(self): + return [record._build_documents_storage(record) for record in self.search([])] + + @api.constrains("model_ids", "save_type") + def _constrain_model_ids(self): + for storage in self: + if storage.save_type == "attachment": + continue + if self.env["dms.directory"].search( + [ + ("storage_id", "=", storage.id), + ("is_root_directory", "=", True), + ( + "res_model", + "not in", + storage.mapped("model_ids.model"), + ), + ] + ): + raise ValidationError( + _("Some directories are inconsistent with the storage models") + ) + if storage.model_ids and self.env["dms.directory"].search( + [ + ("storage_id", "=", storage.id), + ("is_root_directory", "=", True), + ("res_model", "=", False), + ] + ): + raise ValidationError( + _("There are directories not associated to a record") + ) diff --git a/dms_field/models/ir_actions_act_window_view.py b/dms_field/models/ir_actions_act_window_view.py new file mode 100644 index 000000000..cc555a99d --- /dev/null +++ b/dms_field/models/ir_actions_act_window_view.py @@ -0,0 +1,12 @@ +# Copyright 2020 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields, models + + +class IrActionsActWindowView(models.Model): + _inherit = "ir.actions.act_window.view" + + view_mode = fields.Selection( + selection_add=[("dms_list", "DMS Tree")], ondelete={"dms_list": "cascade"} + ) diff --git a/dms_field/models/ir_ui_view.py b/dms_field/models/ir_ui_view.py new file mode 100644 index 000000000..7dacd9184 --- /dev/null +++ b/dms_field/models/ir_ui_view.py @@ -0,0 +1,60 @@ +# Copyright 2020 Creu Blanca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, fields, models + +from odoo.addons.base.models.ir_ui_view import NameManager + + +class IrUiView(models.Model): + _inherit = "ir.ui.view" + + type = fields.Selection(selection_add=[("dms_list", "DMS Tree")]) + + def _get_view_info(self): + res = super()._get_view_info() + res["dms_list"] = {"icon": "fa fa-file-o"} + return res + + def _postprocess_tag_dms_list(self, node, name_manager, node_info): + parent = node.getparent() + if parent_name := parent and parent.get("name"): + field = name_manager.model._fields.get(parent_name) + if field: + group_definitions = self.env["res.groups"]._get_group_definitions() + model_groups = ( + node_info["model_groups"] + if node_info + else group_definitions.universe + ) + view_groups = ( + node_info["view_groups"] + if node_info + else group_definitions.universe + ) + model_name = field.comodel_name + if model_name not in self.env: + self._raise_view_error( + _("Model not found: %(model)s", model=model_name), node + ) + model = self.env[model_name] + model_groups &= self.env["ir.model.access"]._get_access_groups( + model_name + ) + new_name_manager = NameManager( + model, parent=name_manager, model_groups=model_groups + ) + root_info = { + "view_type": node.tag, + "view_editable": self._editable_node(node, name_manager), + "model_groups": model_groups, + "view_groups": view_groups, + "name_manager": name_manager, + } + new_node_info = dict( + root_info, + modifiers={}, + editable=self._editable_node(node, new_name_manager), + ) + for child in node: + self._postprocess_tag_field(child, new_name_manager, new_node_info) diff --git a/dms_field/models/res_partner.py b/dms_field/models/res_partner.py new file mode 100644 index 000000000..039dce201 --- /dev/null +++ b/dms_field/models/res_partner.py @@ -0,0 +1,9 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models + + +class ResPartner(models.Model): + _name = "res.partner" + _inherit = ["res.partner", "dms.field.mixin"] diff --git a/dms_field/pyproject.toml b/dms_field/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/dms_field/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/dms_field/readme/CONFIGURE.md b/dms_field/readme/CONFIGURE.md new file mode 100644 index 000000000..19e263390 --- /dev/null +++ b/dms_field/readme/CONFIGURE.md @@ -0,0 +1,25 @@ +To use the embedded view in any module, the module must inherit from the +mixin dms.field.mixin (You have an example with res.partner in this +module). + +Once this is done, in the form view of the model we will have to add the +following: + +``` xml + +``` + +In addition, it will be necessary to create an Embedded DMS template for +this model. + +1. *Go to Documents \> Configuration \> Embedded DMS templates* and + create a new record. +2. Set a storage, a model (res.partner for example) and the access + groups you want. +3. You can also use expressions in "Directory format name", for + example: {{object.name}} +4. Click on the "Documents" tab icon and a folder hierarchy will be + created. +5. You can set here the hierarchy of directories, subdirectories and + files you need, this hierarchy will be used as a base when creating + a new record (res.partner for example). diff --git a/dms_field/readme/CONTRIBUTORS.md b/dms_field/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..754508f95 --- /dev/null +++ b/dms_field/readme/CONTRIBUTORS.md @@ -0,0 +1,8 @@ +- Enric Tobella \<\> +- Jaime Arroyo \<\> +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Carlos Roca + +- [PyTech](https://www.pytech.it): + - Simone Rubino \ No newline at end of file diff --git a/dms_field/readme/DESCRIPTION.md b/dms_field/readme/DESCRIPTION.md new file mode 100644 index 000000000..c6f0d76bf --- /dev/null +++ b/dms_field/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This addon creates a new kind of view and allows to define a folder +related to a record. diff --git a/dms_field/readme/ROADMAP.md b/dms_field/readme/ROADMAP.md new file mode 100644 index 000000000..51de5189a --- /dev/null +++ b/dms_field/readme/ROADMAP.md @@ -0,0 +1,3 @@ +- Add drag & drop compatibility to the dms_tree mode +- Multiple selection support (e.g. cut several files and paste to + another folder). diff --git a/dms_field/readme/USAGE.md b/dms_field/readme/USAGE.md new file mode 100644 index 000000000..5bc427e79 --- /dev/null +++ b/dms_field/readme/USAGE.md @@ -0,0 +1,5 @@ +1. Go to the form view of an existing partner and click on the + "DMS" tab icon, a hierarchy of folders and files linked to + that record will be created. +2. Create a new partner. A hierarchy of folders and files + linked to that record will be created. diff --git a/dms_field/security/ir.model.access.csv b/dms_field/security/ir.model.access.csv new file mode 100644 index 000000000..c8048dedd --- /dev/null +++ b/dms_field/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_dms_field_template_user,dms_field_template_user,model_dms_field_template,base.group_user,1,0,0,0 +access_dms_field_template_manager,dms_field_template_manager,model_dms_field_template,dms.group_dms_manager,1,1,1,1 diff --git a/dms_field/security/security.xml b/dms_field/security/security.xml new file mode 100644 index 000000000..8dcd29e16 --- /dev/null +++ b/dms_field/security/security.xml @@ -0,0 +1,19 @@ + + + + DMS Field Template multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + + DMS Access Group multi-company + + + ['|',('company_id','=',False),('company_id','in',company_ids)] + + diff --git a/dms_field/static/description/icon.png b/dms_field/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/dms_field/static/description/icon.png differ diff --git a/dms_field/static/description/index.html b/dms_field/static/description/index.html new file mode 100644 index 000000000..e38fbacd4 --- /dev/null +++ b/dms_field/static/description/index.html @@ -0,0 +1,489 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

DMS Field

+ +

Beta License: LGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

+

This addon creates a new kind of view and allows to define a folder +related to a record.

+

Table of contents

+ +
+

Configuration

+

To use the embedded view in any module, the module must inherit from the +mixin dms.field.mixin (You have an example with res.partner in this +module).

+

Once this is done, in the form view of the model we will have to add the +following:

+
+<field name="dms_directory_ids" mode="dms_list" />
+
+

In addition, it will be necessary to create an Embedded DMS template for +this model.

+
    +
  1. Go to Documents > Configuration > Embedded DMS templates and create +a new record.
  2. +
  3. Set a storage, a model (res.partner for example) and the access +groups you want.
  4. +
  5. You can also use expressions in “Directory format name”, for example: +{{object.name}}
  6. +
  7. Click on the “Documents” tab icon and a folder hierarchy will be +created.
  8. +
  9. You can set here the hierarchy of directories, subdirectories and +files you need, this hierarchy will be used as a base when creating a +new record (res.partner for example).
  10. +
+
+
+

Usage

+
    +
  1. Go to the form view of an existing partner and click on the “DMS” tab +icon, a hierarchy of folders and files linked to that record will be +created.
  2. +
  3. Create a new partner. A hierarchy of folders and files linked to that +record will be created.
  4. +
+
+
+

Known issues / Roadmap

+
    +
  • Add drag & drop compatibility to the dms_tree mode
  • +
  • Multiple selection support (e.g. cut several files and paste to +another folder).
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • Creu Blanca
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

CarlosRoca13

+

This module is part of the OCA/dms project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+
+ + diff --git a/dms_field/static/lib/jsTree/LICENSE b/dms_field/static/lib/jsTree/LICENSE new file mode 100644 index 000000000..f47245ea7 --- /dev/null +++ b/dms_field/static/lib/jsTree/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 Ivan Bozhanov + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/jstree.js b/dms_field/static/lib/jsTree/jstree.js new file mode 100644 index 000000000..588cccc8a --- /dev/null +++ b/dms_field/static/lib/jsTree/jstree.js @@ -0,0 +1,8745 @@ +/*globals jQuery, define, module, exports, require, window, document, postMessage */ +(function (factory) { + "use strict"; + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } + else if(typeof module !== 'undefined' && module.exports) { + module.exports = factory(require('jquery')); + } + else { + factory(jQuery); + } +}(function ($, undefined) { + "use strict"; +/*! + * jsTree 3.3.17 + * http://jstree.com/ + * + * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com) + * + * Licensed same as jquery - under the terms of the MIT License + * http://www.opensource.org/licenses/mit-license.php + */ +/*! + * if using jslint please allow for the jQuery global and use following options: + * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true + */ +/*jshint -W083 */ + + // prevent another load? maybe there is a better way? + if($.jstree) { + return; + } + + /** + * ### jsTree core functionality + */ + + // internal variables + var instance_counter = 0, + ccp_node = false, + ccp_mode = false, + ccp_inst = false, + themes_loaded = [], + src = $('script:last').attr('src'), + document = window.document; // local variable is always faster to access then a global + + var setImmediate = window.setImmediate; + var Promise = window.Promise; + if (!setImmediate && Promise) { + // Good enough approximation of setImmediate + setImmediate = function (cb, arg) { + Promise.resolve(arg).then(cb); + }; + } + + /** + * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances. + * @name $.jstree + */ + $.jstree = { + /** + * specifies the jstree version in use + * @name $.jstree.version + */ + version : '3.3.17', + /** + * holds all the default options used when creating new instances + * @name $.jstree.defaults + */ + defaults : { + /** + * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]` + * @name $.jstree.defaults.plugins + */ + plugins : [] + }, + /** + * stores all loaded jstree plugins (used internally) + * @name $.jstree.plugins + */ + plugins : {}, + path : src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/,'') : '', + idregex : /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g, + root : '#' + }; + + /** + * creates a jstree instance + * @name $.jstree.create(el [, options]) + * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector + * @param {Object} options options for this instance (extends `$.jstree.defaults`) + * @return {jsTree} the new instance + */ + $.jstree.create = function (el, options) { + var tmp = new $.jstree.core(++instance_counter), + opt = options; + options = $.extend(true, {}, $.jstree.defaults, options); + if(opt && opt.plugins) { + options.plugins = opt.plugins; + } + $.each(options.plugins, function (i, k) { + if(i !== 'core') { + tmp = tmp.plugin(k, options[k]); + } + }); + $(el).data('jstree', tmp); + tmp.init(el, options); + return tmp; + }; + /** + * remove all traces of jstree from the DOM and destroy all instances + * @name $.jstree.destroy() + */ + $.jstree.destroy = function () { + $('.jstree:jstree').jstree('destroy'); + $(document).off('.jstree'); + }; + /** + * the jstree class constructor, used only internally + * @private + * @name $.jstree.core(id) + * @param {Number} id this instance's index + */ + $.jstree.core = function (id) { + this._id = id; + this._cnt = 0; + this._wrk = null; + this._data = { + core : { + themes : { + name : false, + dots : false, + icons : false, + ellipsis : false + }, + selected : [], + last_error : {}, + working : false, + worker_queue : [], + focused : null + } + }; + }; + /** + * get a reference to an existing instance + * + * __Examples__ + * + * // provided a container with an ID of "tree", and a nested node with an ID of "branch" + * // all of there will return the same instance + * $.jstree.reference('tree'); + * $.jstree.reference('#tree'); + * $.jstree.reference($('#tree')); + * $.jstree.reference(document.getElementByID('tree')); + * $.jstree.reference('branch'); + * $.jstree.reference('#branch'); + * $.jstree.reference($('#branch')); + * $.jstree.reference(document.getElementByID('branch')); + * + * @name $.jstree.reference(needle) + * @param {DOMElement|jQuery|String} needle + * @return {jsTree|null} the instance or `null` if not found + */ + $.jstree.reference = function (needle) { + var tmp = null, + obj = null; + if(needle && needle.id && (!needle.tagName || !needle.nodeType)) { needle = needle.id; } + + if(!obj || !obj.length) { + try { obj = $(needle); } catch (ignore) { } + } + if(!obj || !obj.length) { + try { obj = $('#' + needle.replace($.jstree.idregex,'\\$&')); } catch (ignore) { } + } + if(obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) { + tmp = obj; + } + else { + $('.jstree').each(function () { + var inst = $(this).data('jstree'); + if(inst && inst._model.data[needle]) { + tmp = inst; + return false; + } + }); + } + return tmp; + }; + /** + * Create an instance, get an instance or invoke a command on a instance. + * + * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken). + * + * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function). + * + * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`). + * + * In any other case - nothing is returned and chaining is not broken. + * + * __Examples__ + * + * $('#tree1').jstree(); // creates an instance + * $('#tree2').jstree({ plugins : [] }); // create an instance with some options + * $('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments + * $('#tree2').jstree(); // get an existing instance (or create an instance) + * $('#tree2').jstree(true); // get an existing instance (will not create new instance) + * $('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method) + * + * @name $().jstree([arg]) + * @param {String|Object} arg + * @return {Mixed} + */ + $.fn.jstree = function (arg) { + // check for string argument + var is_method = (typeof arg === 'string'), + args = Array.prototype.slice.call(arguments, 1), + result = null; + if(arg === true && !this.length) { return false; } + this.each(function () { + // get the instance (if there is one) and method (if it exists) + var instance = $.jstree.reference(this), + method = is_method && instance ? instance[arg] : null; + // if calling a method, and method is available - execute on the instance + result = is_method && method ? + method.apply(instance, args) : + null; + // if there is no instance and no method is being called - create one + if(!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) { + $.jstree.create(this, arg); + } + // if there is an instance and no method is called - return the instance + if( (instance && !is_method) || arg === true ) { + result = instance || false; + } + // if there was a method call which returned a result - break and return the value + if(result !== null && result !== undefined) { + return false; + } + }); + // if there was a method call with a valid return value - return that, otherwise continue the chain + return result !== null && result !== undefined ? + result : this; + }; + /** + * used to find elements containing an instance + * + * __Examples__ + * + * $('div:jstree').each(function () { + * $(this).jstree('destroy'); + * }); + * + * @name $(':jstree') + * @return {jQuery} + */ + $.expr.pseudos.jstree = $.expr.createPseudo(function(search) { + return function(a) { + return $(a).hasClass('jstree') && + $(a).data('jstree') !== undefined; + }; + }); + + /** + * stores all defaults for the core + * @name $.jstree.defaults.core + */ + $.jstree.defaults.core = { + /** + * data configuration + * + * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items). + * + * You can also pass in a HTML string or a JSON array here. + * + * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree. + * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used. + * + * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result. + * + * __Examples__ + * + * // AJAX + * $('#tree').jstree({ + * 'core' : { + * 'data' : { + * 'url' : '/get/children/', + * 'data' : function (node) { + * return { 'id' : node.id }; + * } + * } + * }); + * + * // direct data + * $('#tree').jstree({ + * 'core' : { + * 'data' : [ + * 'Simple root node', + * { + * 'id' : 'node_2', + * 'text' : 'Root node with options', + * 'state' : { 'opened' : true, 'selected' : true }, + * 'children' : [ { 'text' : 'Child 1' }, 'Child 2'] + * } + * ] + * } + * }); + * + * // function + * $('#tree').jstree({ + * 'core' : { + * 'data' : function (obj, callback) { + * callback.call(this, ['Root 1', 'Root 2']); + * } + * }); + * + * @name $.jstree.defaults.core.data + */ + data : false, + /** + * configure the various strings used throughout the tree + * + * You can use an object where the key is the string you need to replace and the value is your replacement. + * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement. + * If left as `false` no replacement is made. + * + * __Examples__ + * + * $('#tree').jstree({ + * 'core' : { + * 'strings' : { + * 'Loading ...' : 'Please wait ...' + * } + * } + * }); + * + * @name $.jstree.defaults.core.strings + */ + strings : false, + /** + * determines what happens when a user tries to modify the structure of the tree + * If left as `false` all operations like create, rename, delete, move or copy are prevented. + * You can set this to `true` to allow all interactions or use a function to have better control. + * + * __Examples__ + * + * $('#tree').jstree({ + * 'core' : { + * 'check_callback' : function (operation, node, node_parent, node_position, more) { + * // operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit' + * // in case of 'rename_node' node_position is filled with the new node name + * return operation === 'rename_node' ? true : false; + * } + * } + * }); + * + * @name $.jstree.defaults.core.check_callback + */ + check_callback : false, + /** + * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc) + * @name $.jstree.defaults.core.error + */ + error : $.noop, + /** + * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`) + * @name $.jstree.defaults.core.animation + */ + animation : 200, + /** + * a boolean indicating if multiple nodes can be selected + * @name $.jstree.defaults.core.multiple + */ + multiple : true, + /** + * theme configuration object + * @name $.jstree.defaults.core.themes + */ + themes : { + /** + * the name of the theme to use (if left as `false` the default theme is used) + * @name $.jstree.defaults.core.themes.name + */ + name : false, + /** + * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme. + * @name $.jstree.defaults.core.themes.url + */ + url : false, + /** + * the location of all jstree themes - only used if `url` is set to `true` + * @name $.jstree.defaults.core.themes.dir + */ + dir : false, + /** + * a boolean indicating if connecting dots are shown + * @name $.jstree.defaults.core.themes.dots + */ + dots : true, + /** + * a boolean indicating if node icons are shown + * @name $.jstree.defaults.core.themes.icons + */ + icons : true, + /** + * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container + * @name $.jstree.defaults.core.themes.ellipsis + */ + ellipsis : false, + /** + * a boolean indicating if the tree background is striped + * @name $.jstree.defaults.core.themes.stripes + */ + stripes : false, + /** + * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants) + * @name $.jstree.defaults.core.themes.variant + */ + variant : false, + /** + * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`. + * @name $.jstree.defaults.core.themes.responsive + */ + responsive : false + }, + /** + * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user) + * @name $.jstree.defaults.core.expand_selected_onload + */ + expand_selected_onload : true, + /** + * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true` + * @name $.jstree.defaults.core.worker + */ + worker : true, + /** + * Force node text to plain text (and escape HTML). Defaults to `false` + * @name $.jstree.defaults.core.force_text + */ + force_text : false, + /** + * Should the node be toggled if the text is double clicked. Defaults to `true` + * @name $.jstree.defaults.core.dblclick_toggle + */ + dblclick_toggle : true, + /** + * Should the loaded nodes be part of the state. Defaults to `false` + * @name $.jstree.defaults.core.loaded_state + */ + loaded_state : false, + /** + * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true` + * @name $.jstree.defaults.core.restore_focus + */ + restore_focus : true, + /** + * Force to compute and set "aria-setsize" and "aria-posinset" explicitly for each treeitem. + * Some browsers may compute incorrect elements position and produce wrong announcements for screen readers. Defaults to `false` + * @name $.jstree.defaults.core.compute_elements_positions + */ + compute_elements_positions : false, + /** + * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope) + * @name $.jstree.defaults.core.keyboard + */ + keyboard : { + 'ctrl-space': function (e) { + // aria defines space only with Ctrl + e.type = "click"; + $(e.currentTarget).trigger(e); + }, + 'enter': function (e) { + // enter + e.type = "click"; + $(e.currentTarget).trigger(e); + }, + 'left': function (e) { + // left + e.preventDefault(); + if(this.is_open(e.currentTarget)) { + this.close_node(e.currentTarget); + } + else { + var o = this.get_parent(e.currentTarget); + if(o && o.id !== $.jstree.root) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); } + } + }, + 'up': function (e) { + // up + e.preventDefault(); + var o = this.get_prev_dom(e.currentTarget); + if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); } + }, + 'right': function (e) { + // right + e.preventDefault(); + if(this.is_closed(e.currentTarget)) { + this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').trigger('focus'); }); + } + else if (this.is_open(e.currentTarget)) { + var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0]; + if(o) { $(this._firstChild(o)).children('.jstree-anchor').trigger('focus'); } + } + }, + 'down': function (e) { + // down + e.preventDefault(); + var o = this.get_next_dom(e.currentTarget); + if(o && o.length) { o.children('.jstree-anchor').trigger('focus'); } + }, + '*': function (e) { + // aria defines * on numpad as open_all - not very common + this.open_all(); + }, + 'home': function (e) { + // home + e.preventDefault(); + var o = this._firstChild(this.get_container_ul()[0]); + if(o) { $(o).children('.jstree-anchor').filter(':visible').trigger('focus'); } + }, + 'end': function (e) { + // end + e.preventDefault(); + this.element.find('.jstree-anchor').filter(':visible').last().trigger('focus'); + }, + 'f2': function (e) { + // f2 - safe to include - if check_callback is false it will fail + e.preventDefault(); + this.edit(e.currentTarget); + } + }, + /** + * Should reselecting an already selected node trigger the select and changed callbacks + * @name $.jstree.defaults.core.allow_reselect + */ + allow_reselect : false + }; + $.jstree.core.prototype = { + /** + * used to decorate an instance with a plugin. Used internally. + * @private + * @name plugin(deco [, opts]) + * @param {String} deco the plugin to decorate with + * @param {Object} opts options for the plugin + * @return {jsTree} + */ + plugin : function (deco, opts) { + var Child = $.jstree.plugins[deco]; + if(Child) { + this._data[deco] = {}; + Child.prototype = this; + return new Child(opts, this); + } + return this; + }, + /** + * initialize the instance. Used internally. + * @private + * @name init(el, optons) + * @param {DOMElement|jQuery|String} el the element we are transforming + * @param {Object} options options for this instance + * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree + */ + init : function (el, options) { + this._model = { + data : {}, + changed : [], + force_full_redraw : false, + redraw_timeout : false, + default_state : { + loaded : true, + opened : false, + selected : false, + disabled : false + } + }; + this._model.data[$.jstree.root] = { + id : $.jstree.root, + parent : null, + parents : [], + children : [], + children_d : [], + state : { loaded : false } + }; + + this.element = $(el).addClass('jstree jstree-' + this._id); + this.settings = options; + + this._data.core.ready = false; + this._data.core.loaded = false; + this._data.core.rtl = (this.element.css("direction") === "rtl"); + this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl"); + this.element.attr('role','tree'); + if(this.settings.core.multiple) { + this.element.attr('aria-multiselectable', true); + } + if(!this.element.attr('tabindex')) { + this.element.attr('tabindex','0'); + } + + this.bind(); + /** + * triggered after all events are bound + * @event + * @name init.jstree + */ + this.trigger("init"); + + this._data.core.original_container_html = this.element.find(" > ul > li").clone(true); + this._data.core.original_container_html + .find("li").addBack() + .contents().filter(function() { + return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue)); + }) + .remove(); + this.element.html("<"+"ul class='jstree-container-ul jstree-children' role='group'><"+"li id='j"+this._id+"_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none'><"+"a class='jstree-anchor' role='treeitem' href='#'>" + this.get_string("Loading ...") + ""); + this.element.attr('aria-activedescendant','j' + this._id + '_loading'); + this._data.core.li_height = this.get_container_ul().children("li").first().outerHeight() || 24; + this._data.core.node = this._create_prototype_node(); + /** + * triggered after the loading text is shown and before loading starts + * @event + * @name loading.jstree + */ + this.trigger("loading"); + this.load_node($.jstree.root); + }, + /** + * destroy an instance + * @name destroy() + * @param {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact + */ + destroy : function (keep_html) { + /** + * triggered before the tree is destroyed + * @event + * @name destroy.jstree + */ + this.trigger("destroy"); + if(this._wrk) { + try { + window.URL.revokeObjectURL(this._wrk); + this._wrk = null; + } + catch (ignore) { } + } + if(!keep_html) { this.element.empty(); } + this.teardown(); + }, + /** + * Create a prototype node + * @name _create_prototype_node() + * @return {DOMElement} + */ + _create_prototype_node : function () { + var _node = document.createElement('LI'), _temp1, _temp2; + _node.setAttribute('role', 'none'); + _temp1 = document.createElement('I'); + _temp1.className = 'jstree-icon jstree-ocl'; + _temp1.setAttribute('role', 'presentation'); + _node.appendChild(_temp1); + _temp1 = document.createElement('A'); + _temp1.className = 'jstree-anchor'; + _temp1.setAttribute('href','#'); + _temp1.setAttribute('tabindex','-1'); + _temp1.setAttribute('role', 'treeitem'); + _temp2 = document.createElement('I'); + _temp2.className = 'jstree-icon jstree-themeicon'; + _temp2.setAttribute('role', 'presentation'); + _temp1.appendChild(_temp2); + _node.appendChild(_temp1); + _temp1 = _temp2 = null; + + return _node; + }, + _kbevent_to_func : function (e) { + var keys = { + 8: "Backspace", 9: "Tab", 13: "Enter", 19: "Pause", 27: "Esc", + 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", + 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "Print", 45: "Insert", + 46: "Delete", 96: "Numpad0", 97: "Numpad1", 98: "Numpad2", 99 : "Numpad3", + 100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7", + 104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1", + 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", + 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock", + 145: "Scrolllock", 16: 'Shift', 17: 'Ctrl', 18: 'Alt', + 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', + 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', + 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', + 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', + 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', + 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', + 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', + 219: '[', 220: '\\',221: ']', 222: "'", 111: '/', 106: '*', 173: '-' + }; + var parts = []; + if (e.ctrlKey) { parts.push('ctrl'); } + if (e.altKey) { parts.push('alt'); } + if (e.shiftKey) { parts.push('shift'); } + parts.push(keys[e.which] ? keys[e.which].toLowerCase() : e.which); + parts = parts.sort().join('-').toLowerCase(); + if (parts === 'shift-shift' || parts === 'ctrl-ctrl' || parts === 'alt-alt') { + return null; + } + + var kb = this.settings.core.keyboard, i, tmp; + for (i in kb) { + if (kb.hasOwnProperty(i)) { + tmp = i; + if (tmp !== '-' && tmp !== '+') { + tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS'); + tmp = tmp.split(/-|\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase(); + } + if (tmp === parts) { + return kb[i]; + } + } + } + return null; + }, + /** + * part of the destroying of an instance. Used internally. + * @private + * @name teardown() + */ + teardown : function () { + this.unbind(); + this.element + .removeClass('jstree') + .removeData('jstree') + .find("[class^='jstree']") + .addBack() + .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig,''); }); + this.element = null; + }, + /** + * bind all events. Used internally. + * @private + * @name bind() + */ + bind : function () { + var word = '', + tout = null, + was_click = 0; + this.element + .on("dblclick.jstree", function (e) { + if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } + if(document.selection && document.selection.empty) { + document.selection.empty(); + } + else { + if(window.getSelection) { + var sel = window.getSelection(); + try { + sel.removeAllRanges(); + sel.collapse(); + } catch (ignore) { } + } + } + }) + .on("mousedown.jstree", function (e) { + if(e.target === this.element[0]) { + e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome) + was_click = +(new Date()); // ie does not allow to prevent losing focus + } + }.bind(this)) + .on("mousedown.jstree", ".jstree-ocl", function (e) { + e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon + }) + .on("click.jstree", ".jstree-ocl", function (e) { + this.toggle_node(e.target); + }.bind(this)) + .on("dblclick.jstree", ".jstree-anchor", function (e) { + if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } + if(this.settings.core.dblclick_toggle) { + this.toggle_node(e.target); + } + }.bind(this)) + .on("click.jstree", ".jstree-anchor", function (e) { + e.preventDefault(); + if(e.currentTarget !== document.activeElement) { $(e.currentTarget).trigger('focus'); } + this.activate_node(e.currentTarget, e); + }.bind(this)) + .on('keydown.jstree', '.jstree-anchor', function (e) { + if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } + if(this._data.core.rtl) { + if(e.which === 37) { e.which = 39; } + else if(e.which === 39) { e.which = 37; } + } + var f = this._kbevent_to_func(e); + if (f) { + var r = f.call(this, e); + if (r === false || r === true) { + return r; + } + } + }.bind(this)) + .on("load_node.jstree", function (e, data) { + if(data.status) { + if(data.node.id === $.jstree.root && !this._data.core.loaded) { + this._data.core.loaded = true; + if(this._firstChild(this.get_container_ul()[0])) { + this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id); + } + /** + * triggered after the root node is loaded for the first time + * @event + * @name loaded.jstree + */ + this.trigger("loaded"); + } + if(!this._data.core.ready) { + setTimeout(function() { + if(this.element && !this.get_container_ul().find('.jstree-loading').length) { + this._data.core.ready = true; + if(this._data.core.selected.length) { + if(this.settings.core.expand_selected_onload) { + var tmp = [], i, j; + for(i = 0, j = this._data.core.selected.length; i < j; i++) { + tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents); + } + tmp = $.vakata.array_unique(tmp); + for(i = 0, j = tmp.length; i < j; i++) { + this.open_node(tmp[i], false, 0); + } + } + this.trigger('changed', { 'action' : 'ready', 'selected' : this._data.core.selected }); + } + /** + * triggered after all nodes are finished loading + * @event + * @name ready.jstree + */ + this.trigger("ready"); + } + }.bind(this), 0); + } + } + }.bind(this)) + // quick searching when the tree is focused + .on('keypress.jstree', function (e) { + if(e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } + if(tout) { clearTimeout(tout); } + tout = setTimeout(function () { + word = ''; + }, 500); + + var chr = String.fromCharCode(e.which).toLowerCase(), + col = this.element.find('.jstree-anchor').filter(':visible'), + ind = col.index(document.activeElement) || 0, + end = false; + word += chr; + + // match for whole word from current node down (including the current node) + if(word.length > 1) { + col.slice(ind).each(function (i, v) { + if($(v).text().toLowerCase().indexOf(word) === 0) { + $(v).trigger('focus'); + end = true; + return false; + } + }.bind(this)); + if(end) { return; } + + // match for whole word from the beginning of the tree + col.slice(0, ind).each(function (i, v) { + if($(v).text().toLowerCase().indexOf(word) === 0) { + $(v).trigger('focus'); + end = true; + return false; + } + }.bind(this)); + if(end) { return; } + } + // list nodes that start with that letter (only if word consists of a single char) + if(new RegExp('^' + chr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '+$').test(word)) { + // search for the next node starting with that letter + col.slice(ind + 1).each(function (i, v) { + if($(v).text().toLowerCase().charAt(0) === chr) { + $(v).trigger('focus'); + end = true; + return false; + } + }.bind(this)); + if(end) { return; } + + // search from the beginning + col.slice(0, ind + 1).each(function (i, v) { + if($(v).text().toLowerCase().charAt(0) === chr) { + $(v).trigger('focus'); + end = true; + return false; + } + }.bind(this)); + if(end) { return; } + } + }.bind(this)) + // THEME RELATED + .on("init.jstree", function () { + var s = this.settings.core.themes; + this._data.core.themes.dots = s.dots; + this._data.core.themes.stripes = s.stripes; + this._data.core.themes.icons = s.icons; + this._data.core.themes.ellipsis = s.ellipsis; + this.set_theme(s.name || "default", s.url); + this.set_theme_variant(s.variant); + }.bind(this)) + .on("loading.jstree", function () { + this[ this._data.core.themes.dots ? "show_dots" : "hide_dots" ](); + this[ this._data.core.themes.icons ? "show_icons" : "hide_icons" ](); + this[ this._data.core.themes.stripes ? "show_stripes" : "hide_stripes" ](); + this[ this._data.core.themes.ellipsis ? "show_ellipsis" : "hide_ellipsis" ](); + }.bind(this)) + .on('blur.jstree', '.jstree-anchor', function (e) { + this._data.core.focused = null; + $(e.currentTarget).filter('.jstree-hovered').trigger('mouseleave'); + this.element.attr('tabindex', '0'); + $(e.currentTarget).attr('tabindex', '-1'); + }.bind(this)) + .on('focus.jstree', '.jstree-anchor', function (e) { + var tmp = this.get_node(e.currentTarget); + if(tmp && (tmp.id || tmp.id === 0)) { + this._data.core.focused = tmp.id; + } + this.element.find('.jstree-hovered').not(e.currentTarget).trigger('mouseleave'); + $(e.currentTarget).trigger('mouseenter'); + this.element.attr('tabindex', '-1'); + $(e.currentTarget).attr('tabindex', '0'); + }.bind(this)) + .on('focus.jstree', function () { + if(+(new Date()) - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) { + was_click = 0; + var act = this.get_node(this.element.attr('aria-activedescendant'), true); + if(act) { + act.find('> .jstree-anchor').trigger('focus'); + } + } + }.bind(this)) + .on('mouseenter.jstree', '.jstree-anchor', function (e) { + this.hover_node(e.currentTarget); + }.bind(this)) + .on('mouseleave.jstree', '.jstree-anchor', function (e) { + this.dehover_node(e.currentTarget); + }.bind(this)); + }, + /** + * part of the destroying of an instance. Used internally. + * @private + * @name unbind() + */ + unbind : function () { + this.element.off('.jstree'); + $(document).off('.jstree-' + this._id); + }, + /** + * trigger an event. Used internally. + * @private + * @name trigger(ev [, data]) + * @param {String} ev the name of the event to trigger + * @param {Object} data additional data to pass with the event + */ + trigger : function (ev, data) { + if(!data) { + data = {}; + } + data.instance = this; + this.element.triggerHandler(ev.replace('.jstree','') + '.jstree', data); + }, + /** + * returns the jQuery extended instance container + * @name get_container() + * @return {jQuery} + */ + get_container : function () { + return this.element; + }, + /** + * returns the jQuery extended main UL node inside the instance container. Used internally. + * @private + * @name get_container_ul() + * @return {jQuery} + */ + get_container_ul : function () { + return this.element.children(".jstree-children").first(); + }, + /** + * gets string replacements (localization). Used internally. + * @private + * @name get_string(key) + * @param {String} key + * @return {String} + */ + get_string : function (key) { + var a = this.settings.core.strings; + if($.vakata.is_function(a)) { return a.call(this, key); } + if(a && a[key]) { return a[key]; } + return key; + }, + /** + * gets the first child of a DOM node. Used internally. + * @private + * @name _firstChild(dom) + * @param {DOMElement} dom + * @return {DOMElement} + */ + _firstChild : function (dom) { + dom = dom ? dom.firstChild : null; + while(dom !== null && dom.nodeType !== 1) { + dom = dom.nextSibling; + } + return dom; + }, + /** + * gets the next sibling of a DOM node. Used internally. + * @private + * @name _nextSibling(dom) + * @param {DOMElement} dom + * @return {DOMElement} + */ + _nextSibling : function (dom) { + dom = dom ? dom.nextSibling : null; + while(dom !== null && dom.nodeType !== 1) { + dom = dom.nextSibling; + } + return dom; + }, + /** + * gets the previous sibling of a DOM node. Used internally. + * @private + * @name _previousSibling(dom) + * @param {DOMElement} dom + * @return {DOMElement} + */ + _previousSibling : function (dom) { + dom = dom ? dom.previousSibling : null; + while(dom !== null && dom.nodeType !== 1) { + dom = dom.previousSibling; + } + return dom; + }, + /** + * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc) + * @name get_node(obj [, as_dom]) + * @param {mixed} obj + * @param {Boolean} as_dom + * @return {Object|jQuery} + */ + get_node : function (obj, as_dom) { + if(obj && (obj.id || obj.id === 0)) { + obj = obj.id; + } + if (obj instanceof $ && obj.length && obj[0].id) { + obj = obj[0].id; + } + var dom; + try { + if(this._model.data[obj]) { + obj = this._model.data[obj]; + } + else if(typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) { + obj = this._model.data[obj.replace(/^#/, '')]; + } + else if(typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex,'\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { + obj = this._model.data[dom.closest('.jstree-node').attr('id')]; + } + else if((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { + obj = this._model.data[dom.closest('.jstree-node').attr('id')]; + } + else if((dom = this.element.find(obj)).length && dom.hasClass('jstree')) { + obj = this._model.data[$.jstree.root]; + } + else { + return false; + } + + if(as_dom) { + obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element); + } + return obj; + } catch (ex) { return false; } + }, + /** + * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array) + * @name get_path(obj [, glue, ids]) + * @param {mixed} obj the node + * @param {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned + * @param {Boolean} ids if set to true build the path using ID, otherwise node text is used + * @return {mixed} + */ + get_path : function (obj, glue, ids) { + obj = obj.parents ? obj : this.get_node(obj); + if(!obj || obj.id === $.jstree.root || !obj.parents) { + return false; + } + var i, j, p = []; + p.push(ids ? obj.id : obj.text); + for(i = 0, j = obj.parents.length; i < j; i++) { + p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i])); + } + p = p.reverse().slice(1); + return glue ? p.join(glue) : p; + }, + /** + * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned. + * @name get_next_dom(obj [, strict]) + * @param {mixed} obj + * @param {Boolean} strict + * @return {jQuery} + */ + get_next_dom : function (obj, strict) { + var tmp; + obj = this.get_node(obj, true); + if(obj[0] === this.element[0]) { + tmp = this._firstChild(this.get_container_ul()[0]); + while (tmp && tmp.offsetHeight === 0) { + tmp = this._nextSibling(tmp); + } + return tmp ? $(tmp) : false; + } + if(!obj || !obj.length) { + return false; + } + if(strict) { + tmp = obj[0]; + do { + tmp = this._nextSibling(tmp); + } while (tmp && tmp.offsetHeight === 0); + return tmp ? $(tmp) : false; + } + if(obj.hasClass("jstree-open")) { + tmp = this._firstChild(obj.children('.jstree-children')[0]); + while (tmp && tmp.offsetHeight === 0) { + tmp = this._nextSibling(tmp); + } + if(tmp !== null) { + return $(tmp); + } + } + tmp = obj[0]; + do { + tmp = this._nextSibling(tmp); + } while (tmp && tmp.offsetHeight === 0); + if(tmp !== null) { + return $(tmp); + } + return obj.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first(); + }, + /** + * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned. + * @name get_prev_dom(obj [, strict]) + * @param {mixed} obj + * @param {Boolean} strict + * @return {jQuery} + */ + get_prev_dom : function (obj, strict) { + var tmp; + obj = this.get_node(obj, true); + if(obj[0] === this.element[0]) { + tmp = this.get_container_ul()[0].lastChild; + while (tmp && tmp.offsetHeight === 0) { + tmp = this._previousSibling(tmp); + } + return tmp ? $(tmp) : false; + } + if(!obj || !obj.length) { + return false; + } + if(strict) { + tmp = obj[0]; + do { + tmp = this._previousSibling(tmp); + } while (tmp && tmp.offsetHeight === 0); + return tmp ? $(tmp) : false; + } + tmp = obj[0]; + do { + tmp = this._previousSibling(tmp); + } while (tmp && tmp.offsetHeight === 0); + if(tmp !== null) { + obj = $(tmp); + while(obj.hasClass("jstree-open")) { + obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last"); + } + return obj; + } + tmp = obj[0].parentNode.parentNode; + return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false; + }, + /** + * get the parent ID of a node + * @name get_parent(obj) + * @param {mixed} obj + * @return {String} + */ + get_parent : function (obj) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + return obj.parent; + }, + /** + * get a jQuery collection of all the children of a node (node must be rendered), returns false on error + * @name get_children_dom(obj) + * @param {mixed} obj + * @return {jQuery} + */ + get_children_dom : function (obj) { + obj = this.get_node(obj, true); + if(obj[0] === this.element[0]) { + return this.get_container_ul().children(".jstree-node"); + } + if(!obj || !obj.length) { + return false; + } + return obj.children(".jstree-children").children(".jstree-node"); + }, + /** + * checks if a node has children + * @name is_parent(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_parent : function (obj) { + obj = this.get_node(obj); + return obj && (obj.state.loaded === false || obj.children.length > 0); + }, + /** + * checks if a node is loaded (its children are available) + * @name is_loaded(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_loaded : function (obj) { + obj = this.get_node(obj); + return obj && obj.state.loaded; + }, + /** + * check if a node is currently loading (fetching children) + * @name is_loading(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_loading : function (obj) { + obj = this.get_node(obj); + return obj && obj.state && obj.state.loading; + }, + /** + * check if a node is opened + * @name is_open(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_open : function (obj) { + obj = this.get_node(obj); + return obj && obj.state.opened; + }, + /** + * check if a node is in a closed state + * @name is_closed(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_closed : function (obj) { + obj = this.get_node(obj); + return obj && this.is_parent(obj) && !obj.state.opened; + }, + /** + * check if a node has no children + * @name is_leaf(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_leaf : function (obj) { + return !this.is_parent(obj); + }, + /** + * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array. + * @name load_node(obj [, callback]) + * @param {mixed} obj + * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status + * @return {Boolean} + * @trigger load_node.jstree + */ + load_node : function (obj, callback) { + var dom = this.get_node(obj, true), k, l, i, j, c; + if($.vakata.is_array(obj)) { + this._load_nodes(obj.slice(), callback); + return true; + } + obj = this.get_node(obj); + if(!obj) { + if(callback) { callback.call(this, obj, false); } + return false; + } + // if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again? + if(obj.state.loaded) { + obj.state.loaded = false; + for(i = 0, j = obj.parents.length; i < j; i++) { + this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { + return $.inArray(v, obj.children_d) === -1; + }); + } + for(k = 0, l = obj.children_d.length; k < l; k++) { + if(this._model.data[obj.children_d[k]].state.selected) { + c = true; + } + delete this._model.data[obj.children_d[k]]; + } + if (c) { + this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { + return $.inArray(v, obj.children_d) === -1; + }); + } + obj.children = []; + obj.children_d = []; + if(c) { + this.trigger('changed', { 'action' : 'load_node', 'node' : obj, 'selected' : this._data.core.selected }); + } + } + obj.state.failed = false; + obj.state.loading = true; + if (obj.id !== $.jstree.root) { + dom.children(".jstree-anchor").attr('aria-busy', true); + } else { + dom.attr('aria-busy', true); + } + dom.addClass("jstree-loading"); + this._load_node(obj, function (status) { + obj = this._model.data[obj.id]; + obj.state.loading = false; + obj.state.loaded = status; + obj.state.failed = !obj.state.loaded; + var dom = this.get_node(obj, true), i = 0, j = 0, m = this._model.data, has_children = false; + for(i = 0, j = obj.children.length; i < j; i++) { + if(m[obj.children[i]] && !m[obj.children[i]].state.hidden) { + has_children = true; + break; + } + } + if(obj.state.loaded && dom && dom.length) { + dom.removeClass('jstree-closed jstree-open jstree-leaf'); + if (!has_children) { + dom.addClass('jstree-leaf'); + } + else { + if (obj.id !== '#') { + dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed'); + } + } + } + if (obj.id !== $.jstree.root) { + dom.children(".jstree-anchor").attr('aria-busy', false); + } else { + dom.attr('aria-busy', false); + } + dom.removeClass("jstree-loading"); + /** + * triggered after a node is loaded + * @event + * @name load_node.jstree + * @param {Object} node the node that was loading + * @param {Boolean} status was the node loaded successfully + */ + this.trigger('load_node', { "node" : obj, "status" : status }); + if(callback) { + callback.call(this, obj, status); + } + }.bind(this)); + return true; + }, + /** + * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally. + * @private + * @name _load_nodes(nodes [, callback]) + * @param {array} nodes + * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes + */ + _load_nodes : function (nodes, callback, is_callback, force_reload) { + var r = true, + c = function () { this._load_nodes(nodes, callback, true); }, + m = this._model.data, i, j, tmp = []; + for(i = 0, j = nodes.length; i < j; i++) { + if(m[nodes[i]] && ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || (!is_callback && force_reload) )) { + if(!this.is_loading(nodes[i])) { + this.load_node(nodes[i], c); + } + r = false; + } + } + if(r) { + for(i = 0, j = nodes.length; i < j; i++) { + if(m[nodes[i]] && m[nodes[i]].state.loaded) { + tmp.push(nodes[i]); + } + } + if(callback && !callback.done) { + callback.call(this, tmp); + callback.done = true; + } + } + }, + /** + * loads all unloaded nodes + * @name load_all([obj, callback]) + * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree + * @param {function} callback a function to be executed once loading all the nodes is complete, + * @trigger load_all.jstree + */ + load_all : function (obj, callback) { + if(!obj) { obj = $.jstree.root; } + obj = this.get_node(obj); + if(!obj) { return false; } + var to_load = [], + m = this._model.data, + c = m[obj.id].children_d, + i, j; + if(obj.state && !obj.state.loaded) { + to_load.push(obj.id); + } + for(i = 0, j = c.length; i < j; i++) { + if(m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) { + to_load.push(c[i]); + } + } + if(to_load.length) { + this._load_nodes(to_load, function () { + this.load_all(obj, callback); + }); + } + else { + /** + * triggered after a load_all call completes + * @event + * @name load_all.jstree + * @param {Object} node the recursively loaded node + */ + if(callback) { callback.call(this, obj); } + this.trigger('load_all', { "node" : obj }); + } + }, + /** + * handles the actual loading of a node. Used only internally. + * @private + * @name _load_node(obj [, callback]) + * @param {mixed} obj + * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status + * @return {Boolean} + */ + _load_node : function (obj, callback) { + var s = this.settings.core.data, t; + var notTextOrCommentNode = function notTextOrCommentNode () { + return this.nodeType !== 3 && this.nodeType !== 8; + }; + // use original HTML + if(!s) { + if(obj.id === $.jstree.root) { + return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) { + callback.call(this, status); + }); + } + else { + return callback.call(this, false); + } + // return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false); + } + if($.vakata.is_function(s)) { + return s.call(this, obj, function (d) { + if(d === false) { + callback.call(this, false); + } + else { + this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) { + callback.call(this, status); + }); + } + // return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d)); + }.bind(this)); + } + if(typeof s === 'object') { + if(s.url) { + s = $.extend(true, {}, s); + if($.vakata.is_function(s.url)) { + s.url = s.url.call(this, obj); + } + if($.vakata.is_function(s.data)) { + s.data = s.data.call(this, obj); + } + return $.ajax(s) + .done(function (d,t,x) { + var type = x.getResponseHeader('Content-Type'); + if((type && type.indexOf('json') !== -1) || typeof d === "object") { + return this._append_json_data(obj, d, function (status) { callback.call(this, status); }); + //return callback.call(this, this._append_json_data(obj, d)); + } + if((type && type.indexOf('html') !== -1) || typeof d === "string") { + return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); }); + // return callback.call(this, this._append_html_data(obj, $(d))); + } + this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : x }) }; + this.settings.core.error.call(this, this._data.core.last_error); + return callback.call(this, false); + }.bind(this)) + .fail(function (f) { + this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'core', 'id' : 'core_04', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id, 'xhr' : f }) }; + callback.call(this, false); + this.settings.core.error.call(this, this._data.core.last_error); + }.bind(this)); + } + if ($.vakata.is_array(s)) { + t = $.extend(true, [], s); + } else if ($.isPlainObject(s)) { + t = $.extend(true, {}, s); + } else { + t = s; + } + if(obj.id === $.jstree.root) { + return this._append_json_data(obj, t, function (status) { + callback.call(this, status); + }); + } + else { + this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_05', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) }; + this.settings.core.error.call(this, this._data.core.last_error); + return callback.call(this, false); + } + //return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) ); + } + if(typeof s === 'string') { + if(obj.id === $.jstree.root) { + return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) { + callback.call(this, status); + }); + } + else { + this._data.core.last_error = { 'error' : 'nodata', 'plugin' : 'core', 'id' : 'core_06', 'reason' : 'Could not load node', 'data' : JSON.stringify({ 'id' : obj.id }) }; + this.settings.core.error.call(this, this._data.core.last_error); + return callback.call(this, false); + } + //return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) ); + } + return callback.call(this, false); + }, + /** + * adds a node to the list of nodes to redraw. Used only internally. + * @private + * @name _node_changed(obj [, callback]) + * @param {mixed} obj + */ + _node_changed : function (obj) { + obj = this.get_node(obj); + if (obj && $.inArray(obj.id, this._model.changed) === -1) { + this._model.changed.push(obj.id); + } + }, + /** + * appends HTML content to the tree. Used internally. + * @private + * @name _append_html_data(obj, data) + * @param {mixed} obj the node to append to + * @param {String} data the HTML string to parse and append + * @trigger model.jstree, changed.jstree + */ + _append_html_data : function (dom, data, cb) { + dom = this.get_node(dom); + dom.children = []; + dom.children_d = []; + var dat = data.is('ul') ? data.children() : data, + par = dom.id, + chd = [], + dpc = [], + m = this._model.data, + p = m[par], + s = this._data.core.selected.length, + tmp, i, j; + dat.each(function (i, v) { + tmp = this._parse_model_from_html($(v), par, p.parents.concat()); + if(tmp) { + chd.push(tmp); + dpc.push(tmp); + if(m[tmp].children_d.length) { + dpc = dpc.concat(m[tmp].children_d); + } + } + }.bind(this)); + p.children = chd; + p.children_d = dpc; + for(i = 0, j = p.parents.length; i < j; i++) { + m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); + } + /** + * triggered when new data is inserted to the tree model + * @event + * @name model.jstree + * @param {Array} nodes an array of node IDs + * @param {String} parent the parent ID of the nodes + */ + this.trigger('model', { "nodes" : dpc, 'parent' : par }); + if(par !== $.jstree.root) { + this._node_changed(par); + this.redraw(); + } + else { + this.get_container_ul().children('.jstree-initial-node').remove(); + this.redraw(true); + } + if(this._data.core.selected.length !== s) { + this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected }); + } + cb.call(this, true); + }, + /** + * appends JSON content to the tree. Used internally. + * @private + * @name _append_json_data(obj, data) + * @param {mixed} obj the node to append to + * @param {String} data the JSON object to parse and append + * @param {Boolean} force_processing internal param - do not set + * @trigger model.jstree, changed.jstree + */ + _append_json_data : function (dom, data, cb, force_processing) { + if(this.element === null) { return; } + dom = this.get_node(dom); + dom.children = []; + dom.children_d = []; + // *%$@!!! + if(data.d) { + data = data.d; + if(typeof data === "string") { + data = JSON.parse(data); + } + } + if(!$.vakata.is_array(data)) { data = [data]; } + var w = null, + args = { + 'df' : this._model.default_state, + 'dat' : data, + 'par' : dom.id, + 'm' : this._model.data, + 't_id' : this._id, + 't_cnt' : this._cnt, + 'sel' : this._data.core.selected + }, + inst = this, + func = function (data, undefined) { + if(data.data) { data = data.data; } + var dat = data.dat, + par = data.par, + chd = [], + dpc = [], + add = [], + df = data.df, + t_id = data.t_id, + t_cnt = data.t_cnt, + m = data.m, + p = m[par], + sel = data.sel, + tmp, i, j, rslt, + parse_flat = function (d, p, ps) { + if(!ps) { ps = []; } + else { ps = ps.concat(); } + if(p) { ps.unshift(p); } + var tid = d.id.toString(), + i, j, c, e, + tmp = { + id : tid, + text : d.text || '', + icon : d.icon !== undefined ? d.icon : true, + parent : p, + parents : ps, + children : d.children || [], + children_d : d.children_d || [], + data : d.data, + state : { }, + li_attr : { id : false }, + a_attr : { href : '#' }, + original : false + }; + for(i in df) { + if(df.hasOwnProperty(i)) { + tmp.state[i] = df[i]; + } + } + if(d && d.data && d.data.jstree && d.data.jstree.icon) { + tmp.icon = d.data.jstree.icon; + } + if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { + tmp.icon = true; + } + if(d && d.data) { + tmp.data = d.data; + if(d.data.jstree) { + for(i in d.data.jstree) { + if(d.data.jstree.hasOwnProperty(i)) { + tmp.state[i] = d.data.jstree[i]; + } + } + } + } + if(d && typeof d.state === 'object') { + for (i in d.state) { + if(d.state.hasOwnProperty(i)) { + tmp.state[i] = d.state[i]; + } + } + } + if(d && typeof d.li_attr === 'object') { + for (i in d.li_attr) { + if(d.li_attr.hasOwnProperty(i)) { + tmp.li_attr[i] = d.li_attr[i]; + } + } + } + if(!tmp.li_attr.id) { + tmp.li_attr.id = tid; + } + if(d && typeof d.a_attr === 'object') { + for (i in d.a_attr) { + if(d.a_attr.hasOwnProperty(i)) { + tmp.a_attr[i] = d.a_attr[i]; + } + } + } + if(d && d.children && d.children === true) { + tmp.state.loaded = false; + tmp.children = []; + tmp.children_d = []; + } + m[tmp.id] = tmp; + for(i = 0, j = tmp.children.length; i < j; i++) { + c = parse_flat(m[tmp.children[i]], tmp.id, ps); + e = m[c]; + tmp.children_d.push(c); + if(e.children_d.length) { + tmp.children_d = tmp.children_d.concat(e.children_d); + } + } + delete d.data; + delete d.children; + m[tmp.id].original = d; + if(tmp.state.selected) { + add.push(tmp.id); + } + return tmp.id; + }, + parse_nest = function (d, p, ps) { + if(!ps) { ps = []; } + else { ps = ps.concat(); } + if(p) { ps.unshift(p); } + var tid = false, i, j, c, e, tmp; + do { + tid = 'j' + t_id + '_' + (++t_cnt); + } while(m[tid]); + + tmp = { + id : false, + text : typeof d === 'string' ? d : '', + icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true, + parent : p, + parents : ps, + children : [], + children_d : [], + data : null, + state : { }, + li_attr : { id : false }, + a_attr : { href : '#' }, + original : false + }; + for(i in df) { + if(df.hasOwnProperty(i)) { + tmp.state[i] = df[i]; + } + } + if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); } + if(d && d.text) { tmp.text = d.text; } + if(d && d.data && d.data.jstree && d.data.jstree.icon) { + tmp.icon = d.data.jstree.icon; + } + if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { + tmp.icon = true; + } + if(d && d.data) { + tmp.data = d.data; + if(d.data.jstree) { + for(i in d.data.jstree) { + if(d.data.jstree.hasOwnProperty(i)) { + tmp.state[i] = d.data.jstree[i]; + } + } + } + } + if(d && typeof d.state === 'object') { + for (i in d.state) { + if(d.state.hasOwnProperty(i)) { + tmp.state[i] = d.state[i]; + } + } + } + if(d && typeof d.li_attr === 'object') { + for (i in d.li_attr) { + if(d.li_attr.hasOwnProperty(i)) { + tmp.li_attr[i] = d.li_attr[i]; + } + } + } + if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) { + tmp.id = tmp.li_attr.id.toString(); + } + if(!(tmp.id || tmp.id === 0)) { + tmp.id = tid; + } + if(!tmp.li_attr.id) { + tmp.li_attr.id = tmp.id; + } + if(d && typeof d.a_attr === 'object') { + for (i in d.a_attr) { + if(d.a_attr.hasOwnProperty(i)) { + tmp.a_attr[i] = d.a_attr[i]; + } + } + } + if(d && d.children && d.children.length) { + for(i = 0, j = d.children.length; i < j; i++) { + c = parse_nest(d.children[i], tmp.id, ps); + e = m[c]; + tmp.children.push(c); + if(e.children_d.length) { + tmp.children_d = tmp.children_d.concat(e.children_d); + } + } + tmp.children_d = tmp.children_d.concat(tmp.children); + } + if(d && d.children && d.children === true) { + tmp.state.loaded = false; + tmp.children = []; + tmp.children_d = []; + } + delete d.data; + delete d.children; + tmp.original = d; + m[tmp.id] = tmp; + if(tmp.state.selected) { + add.push(tmp.id); + } + return tmp.id; + }; + + if(dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) { + // Flat JSON support (for easy import from DB): + // 1) convert to object (foreach) + for(i = 0, j = dat.length; i < j; i++) { + if(!dat[i].children) { + dat[i].children = []; + } + if(!dat[i].state) { + dat[i].state = {}; + } + m[dat[i].id.toString()] = dat[i]; + } + // 2) populate children (foreach) + for(i = 0, j = dat.length; i < j; i++) { + if (!m[dat[i].parent.toString()]) { + if (typeof inst !== "undefined") { + inst._data.core.last_error = { 'error' : 'parse', 'plugin' : 'core', 'id' : 'core_07', 'reason' : 'Node with invalid parent', 'data' : JSON.stringify({ 'id' : dat[i].id.toString(), 'parent' : dat[i].parent.toString() }) }; + inst.settings.core.error.call(inst, inst._data.core.last_error); + } + continue; + } + + m[dat[i].parent.toString()].children.push(dat[i].id.toString()); + // populate parent.children_d + p.children_d.push(dat[i].id.toString()); + } + // 3) normalize && populate parents and children_d with recursion + for(i = 0, j = p.children.length; i < j; i++) { + tmp = parse_flat(m[p.children[i]], par, p.parents.concat()); + dpc.push(tmp); + if(m[tmp].children_d.length) { + dpc = dpc.concat(m[tmp].children_d); + } + } + for(i = 0, j = p.parents.length; i < j; i++) { + m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); + } + // ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true; + rslt = { + 'cnt' : t_cnt, + 'mod' : m, + 'sel' : sel, + 'par' : par, + 'dpc' : dpc, + 'add' : add + }; + } + else { + for(i = 0, j = dat.length; i < j; i++) { + tmp = parse_nest(dat[i], par, p.parents.concat()); + if(tmp) { + chd.push(tmp); + dpc.push(tmp); + if(m[tmp].children_d.length) { + dpc = dpc.concat(m[tmp].children_d); + } + } + } + p.children = chd; + p.children_d = dpc; + for(i = 0, j = p.parents.length; i < j; i++) { + m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); + } + rslt = { + 'cnt' : t_cnt, + 'mod' : m, + 'sel' : sel, + 'par' : par, + 'dpc' : dpc, + 'add' : add + }; + } + if(typeof window === 'undefined' || typeof window.document === 'undefined') { + postMessage(rslt); + } + else { + return rslt; + } + }, + rslt = function (rslt, worker) { + if(this.element === null) { return; } + this._cnt = rslt.cnt; + var i, m = this._model.data; + for (i in m) { + if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && rslt.mod[i]) { + rslt.mod[i].state.loading = true; + } + } + this._model.data = rslt.mod; // breaks the reference in load_node - careful + + if(worker) { + var j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice(); + m = this._model.data; + // if selection was changed while calculating in worker + if(r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) { + // deselect nodes that are no longer selected + for(i = 0, j = r.length; i < j; i++) { + if($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) { + m[r[i]].state.selected = false; + } + } + // select nodes that were selected in the mean time + for(i = 0, j = s.length; i < j; i++) { + if($.inArray(s[i], r) === -1) { + m[s[i]].state.selected = true; + } + } + } + } + if(rslt.add.length) { + this._data.core.selected = this._data.core.selected.concat(rslt.add); + } + + this.trigger('model', { "nodes" : rslt.dpc, 'parent' : rslt.par }); + + if(rslt.par !== $.jstree.root) { + this._node_changed(rslt.par); + this.redraw(); + } + else { + // this.get_container_ul().children('.jstree-initial-node').remove(); + this.redraw(true); + } + if(rslt.add.length) { + this.trigger('changed', { 'action' : 'model', 'selected' : this._data.core.selected }); + } + + // If no worker, try to mimic worker behavioour, by invoking cb asynchronously + if (!worker && setImmediate) { + setImmediate(function(){ + cb.call(inst, true); + }); + } + else { + cb.call(inst, true); + } + }; + if(this.settings.core.worker && window.Blob && window.URL && window.Worker) { + try { + if(this._wrk === null) { + this._wrk = window.URL.createObjectURL( + new window.Blob( + ['self.onmessage = ' + func.toString()], + {type:"text/javascript"} + ) + ); + } + if(!this._data.core.working || force_processing) { + this._data.core.working = true; + w = new window.Worker(this._wrk); + w.onmessage = function (e) { + rslt.call(this, e.data, true); + try { w.terminate(); w = null; } catch(ignore) { } + if(this._data.core.worker_queue.length) { + this._append_json_data.apply(this, this._data.core.worker_queue.shift()); + } + else { + this._data.core.working = false; + } + }.bind(this); + w.onerror = function (e) { + rslt.call(this, func(args), false); + if(this._data.core.worker_queue.length) { + this._append_json_data.apply(this, this._data.core.worker_queue.shift()); + } + else { + this._data.core.working = false; + } + }.bind(this); + if(!args.par) { + if(this._data.core.worker_queue.length) { + this._append_json_data.apply(this, this._data.core.worker_queue.shift()); + } + else { + this._data.core.working = false; + } + } + else { + w.postMessage(args); + } + } + else { + this._data.core.worker_queue.push([dom, data, cb, true]); + } + } + catch(e) { + rslt.call(this, func(args), false); + if(this._data.core.worker_queue.length) { + this._append_json_data.apply(this, this._data.core.worker_queue.shift()); + } + else { + this._data.core.working = false; + } + } + } + else { + rslt.call(this, func(args), false); + } + }, + /** + * parses a node from a jQuery object and appends them to the in memory tree model. Used internally. + * @private + * @name _parse_model_from_html(d [, p, ps]) + * @param {jQuery} d the jQuery object to parse + * @param {String} p the parent ID + * @param {Array} ps list of all parents + * @return {String} the ID of the object added to the model + */ + _parse_model_from_html : function (d, p, ps) { + if(!ps) { ps = []; } + else { ps = [].concat(ps); } + if(p) { ps.unshift(p); } + var c, e, m = this._model.data, + data = { + id : false, + text : false, + icon : true, + parent : p, + parents : ps, + children : [], + children_d : [], + data : null, + state : { }, + li_attr : { id : false }, + a_attr : { href : '#' }, + original : false + }, i, tmp, tid; + for(i in this._model.default_state) { + if(this._model.default_state.hasOwnProperty(i)) { + data.state[i] = this._model.default_state[i]; + } + } + tmp = $.vakata.attributes(d, true); + $.each(tmp, function (i, v) { + v = $.vakata.trim(v); + if(!v.length) { return true; } + data.li_attr[i] = v; + if(i === 'id') { + data.id = v.toString(); + } + }); + tmp = d.children('a').first(); + if(tmp.length) { + tmp = $.vakata.attributes(tmp, true); + $.each(tmp, function (i, v) { + v = $.vakata.trim(v); + if(v.length) { + data.a_attr[i] = v; + } + }); + } + tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone(); + tmp.children("ins, i, ul").remove(); + tmp = tmp.html(); + tmp = $('
').html(tmp); + data.text = this.settings.core.force_text ? tmp.text() : tmp.html(); + tmp = d.data(); + data.data = tmp ? $.extend(true, {}, tmp) : null; + data.state.opened = d.hasClass('jstree-open'); + data.state.selected = d.children('a').hasClass('jstree-clicked'); + data.state.disabled = d.children('a').hasClass('jstree-disabled'); + if(data.data && data.data.jstree) { + for(i in data.data.jstree) { + if(data.data.jstree.hasOwnProperty(i)) { + data.state[i] = data.data.jstree[i]; + } + } + } + tmp = d.children("a").children(".jstree-themeicon"); + if(tmp.length) { + data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel'); + } + if(data.state.icon !== undefined) { + data.icon = data.state.icon; + } + if(data.icon === undefined || data.icon === null || data.icon === "") { + data.icon = true; + } + tmp = d.children("ul").children("li"); + do { + tid = 'j' + this._id + '_' + (++this._cnt); + } while(m[tid]); + data.id = data.li_attr.id ? data.li_attr.id.toString() : tid; + if(tmp.length) { + tmp.each(function (i, v) { + c = this._parse_model_from_html($(v), data.id, ps); + e = this._model.data[c]; + data.children.push(c); + if(e.children_d.length) { + data.children_d = data.children_d.concat(e.children_d); + } + }.bind(this)); + data.children_d = data.children_d.concat(data.children); + } + else { + if(d.hasClass('jstree-closed')) { + data.state.loaded = false; + } + } + if(data.li_attr['class']) { + data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed','').replace('jstree-open',''); + } + if(data.a_attr['class']) { + data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked','').replace('jstree-disabled',''); + } + m[data.id] = data; + if(data.state.selected) { + this._data.core.selected.push(data.id); + } + return data.id; + }, + /** + * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally. + * @private + * @name _parse_model_from_flat_json(d [, p, ps]) + * @param {Object} d the JSON object to parse + * @param {String} p the parent ID + * @param {Array} ps list of all parents + * @return {String} the ID of the object added to the model + */ + _parse_model_from_flat_json : function (d, p, ps) { + if(!ps) { ps = []; } + else { ps = ps.concat(); } + if(p) { ps.unshift(p); } + var tid = d.id.toString(), + m = this._model.data, + df = this._model.default_state, + i, j, c, e, + tmp = { + id : tid, + text : d.text || '', + icon : d.icon !== undefined ? d.icon : true, + parent : p, + parents : ps, + children : d.children || [], + children_d : d.children_d || [], + data : d.data, + state : { }, + li_attr : { id : false }, + a_attr : { href : '#' }, + original : false + }; + for(i in df) { + if(df.hasOwnProperty(i)) { + tmp.state[i] = df[i]; + } + } + if(d && d.data && d.data.jstree && d.data.jstree.icon) { + tmp.icon = d.data.jstree.icon; + } + if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { + tmp.icon = true; + } + if(d && d.data) { + tmp.data = d.data; + if(d.data.jstree) { + for(i in d.data.jstree) { + if(d.data.jstree.hasOwnProperty(i)) { + tmp.state[i] = d.data.jstree[i]; + } + } + } + } + if(d && typeof d.state === 'object') { + for (i in d.state) { + if(d.state.hasOwnProperty(i)) { + tmp.state[i] = d.state[i]; + } + } + } + if(d && typeof d.li_attr === 'object') { + for (i in d.li_attr) { + if(d.li_attr.hasOwnProperty(i)) { + tmp.li_attr[i] = d.li_attr[i]; + } + } + } + if(!tmp.li_attr.id) { + tmp.li_attr.id = tid; + } + if(d && typeof d.a_attr === 'object') { + for (i in d.a_attr) { + if(d.a_attr.hasOwnProperty(i)) { + tmp.a_attr[i] = d.a_attr[i]; + } + } + } + if(d && d.children && d.children === true) { + tmp.state.loaded = false; + tmp.children = []; + tmp.children_d = []; + } + m[tmp.id] = tmp; + for(i = 0, j = tmp.children.length; i < j; i++) { + c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps); + e = m[c]; + tmp.children_d.push(c); + if(e.children_d.length) { + tmp.children_d = tmp.children_d.concat(e.children_d); + } + } + delete d.data; + delete d.children; + m[tmp.id].original = d; + if(tmp.state.selected) { + this._data.core.selected.push(tmp.id); + } + return tmp.id; + }, + /** + * parses a node from a JSON object and appends it to the in memory tree model. Used internally. + * @private + * @name _parse_model_from_json(d [, p, ps]) + * @param {Object} d the JSON object to parse + * @param {String} p the parent ID + * @param {Array} ps list of all parents + * @return {String} the ID of the object added to the model + */ + _parse_model_from_json : function (d, p, ps) { + if(!ps) { ps = []; } + else { ps = ps.concat(); } + if(p) { ps.unshift(p); } + var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp; + do { + tid = 'j' + this._id + '_' + (++this._cnt); + } while(m[tid]); + + tmp = { + id : false, + text : typeof d === 'string' ? d : '', + icon : typeof d === 'object' && d.icon !== undefined ? d.icon : true, + parent : p, + parents : ps, + children : [], + children_d : [], + data : null, + state : { }, + li_attr : { id : false }, + a_attr : { href : '#' }, + original : false + }; + for(i in df) { + if(df.hasOwnProperty(i)) { + tmp.state[i] = df[i]; + } + } + if(d && (d.id || d.id === 0)) { tmp.id = d.id.toString(); } + if(d && d.text) { tmp.text = d.text; } + if(d && d.data && d.data.jstree && d.data.jstree.icon) { + tmp.icon = d.data.jstree.icon; + } + if(tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { + tmp.icon = true; + } + if(d && d.data) { + tmp.data = d.data; + if(d.data.jstree) { + for(i in d.data.jstree) { + if(d.data.jstree.hasOwnProperty(i)) { + tmp.state[i] = d.data.jstree[i]; + } + } + } + } + if(d && typeof d.state === 'object') { + for (i in d.state) { + if(d.state.hasOwnProperty(i)) { + tmp.state[i] = d.state[i]; + } + } + } + if(d && typeof d.li_attr === 'object') { + for (i in d.li_attr) { + if(d.li_attr.hasOwnProperty(i)) { + tmp.li_attr[i] = d.li_attr[i]; + } + } + } + if(tmp.li_attr.id && !(tmp.id || tmp.id === 0)) { + tmp.id = tmp.li_attr.id.toString(); + } + if(!(tmp.id || tmp.id === 0)) { + tmp.id = tid; + } + if(!tmp.li_attr.id) { + tmp.li_attr.id = tmp.id; + } + if(d && typeof d.a_attr === 'object') { + for (i in d.a_attr) { + if(d.a_attr.hasOwnProperty(i)) { + tmp.a_attr[i] = d.a_attr[i]; + } + } + } + if(d && d.children && d.children.length) { + for(i = 0, j = d.children.length; i < j; i++) { + c = this._parse_model_from_json(d.children[i], tmp.id, ps); + e = m[c]; + tmp.children.push(c); + if(e.children_d.length) { + tmp.children_d = tmp.children_d.concat(e.children_d); + } + } + tmp.children_d = tmp.children.concat(tmp.children_d); + } + if(d && d.children && d.children === true) { + tmp.state.loaded = false; + tmp.children = []; + tmp.children_d = []; + } + delete d.data; + delete d.children; + tmp.original = d; + m[tmp.id] = tmp; + if(tmp.state.selected) { + this._data.core.selected.push(tmp.id); + } + return tmp.id; + }, + /** + * redraws all nodes that need to be redrawn. Used internally. + * @private + * @name _redraw() + * @trigger redraw.jstree + */ + _redraw : function () { + var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]), + f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused; + for(i = 0, j = nodes.length; i < j; i++) { + tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw); + if(tmp && this._model.force_full_redraw) { + f.appendChild(tmp); + } + } + if(this._model.force_full_redraw) { + f.className = this.get_container_ul()[0].className; + f.setAttribute('role','presentation'); + this.element.empty().append(f); + //this.get_container_ul()[0].appendChild(f); + } + if(fe !== null && this.settings.core.restore_focus) { + tmp = this.get_node(fe, true); + if(tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) { + tmp.children('.jstree-anchor').trigger('focus'); + } + else { + this._data.core.focused = null; + } + } + this._model.force_full_redraw = false; + this._model.changed = []; + /** + * triggered after nodes are redrawn + * @event + * @name redraw.jstree + * @param {array} nodes the redrawn nodes + */ + this.trigger('redraw', { "nodes" : nodes }); + }, + /** + * redraws all nodes that need to be redrawn or optionally - the whole tree + * @name redraw([full]) + * @param {Boolean} full if set to `true` all nodes are redrawn. + */ + redraw : function (full) { + if(full) { + this._model.force_full_redraw = true; + } + //if(this._model.redraw_timeout) { + // clearTimeout(this._model.redraw_timeout); + //} + //this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0); + this._redraw(); + }, + /** + * redraws a single node's children. Used internally. + * @private + * @name draw_children(node) + * @param {mixed} node the node whose children will be redrawn + */ + draw_children : function (node) { + var obj = this.get_node(node), + i = false, + j = false, + k = false, + d = document; + if(!obj) { return false; } + if(obj.id === $.jstree.root) { return this.redraw(true); } + node = this.get_node(node, true); + if(!node || !node.length) { return false; } // TODO: quick toggle + + node.children('.jstree-children').remove(); + node = node[0]; + if(obj.children.length && obj.state.loaded) { + k = d.createElement('UL'); + k.setAttribute('role', 'group'); + k.className = 'jstree-children'; + for(i = 0, j = obj.children.length; i < j; i++) { + k.appendChild(this.redraw_node(obj.children[i], true, true)); + } + node.appendChild(k); + } + }, + /** + * redraws a single node. Used internally. + * @private + * @name redraw_node(node, deep, is_callback, force_render) + * @param {mixed} node the node to redraw + * @param {Boolean} deep should child nodes be redrawn too + * @param {Boolean} is_callback is this a recursion call + * @param {Boolean} force_render should children of closed parents be drawn anyway + */ + redraw_node : function (node, deep, is_callback, force_render) { + var obj = this.get_node(node), + par = false, + ind = false, + old = false, + i = false, + j = false, + k = false, + c = '', + d = document, + m = this._model.data, + f = false, + s = false, + tmp = null, + t = 0, + l = 0, + has_children = false, + last_sibling = false; + if(!obj) { return false; } + if(obj.id === $.jstree.root) { return this.redraw(true); } + deep = deep || obj.children.length === 0; + node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex,'\\$&') : obj.id.replace($.jstree.idregex,'\\$&')) ); //, this.element); + if(!node) { + deep = true; + //node = d.createElement('LI'); + if(!is_callback) { + par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex,'\\$&'), this.element)[0] : null; + if(par !== null && (!par || !m[obj.parent].state.opened)) { + return false; + } + ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children); + } + } + else { + node = $(node); + if(!is_callback) { + par = node.parent().parent()[0]; + if(par === this.element[0]) { + par = null; + } + ind = node.index(); + } + // m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage + if(!deep && obj.children.length && !node.children('.jstree-children').length) { + deep = true; + } + if(!deep) { + old = node.children('.jstree-children')[0]; + } + f = node.children('.jstree-anchor')[0] === document.activeElement; + node.remove(); + //node = d.createElement('LI'); + //node = node[0]; + } + node = this._data.core.node.cloneNode(true); + // node is DOM, deep is boolean + + c = 'jstree-node '; + for(i in obj.li_attr) { + if(obj.li_attr.hasOwnProperty(i)) { + if(i === 'id') { continue; } + if(i !== 'class') { + node.setAttribute(i, obj.li_attr[i]); + } + else { + c += obj.li_attr[i]; + } + } + } + if(!obj.a_attr.id) { + obj.a_attr.id = obj.id + '_anchor'; + } + node.childNodes[1].setAttribute('aria-selected', !!obj.state.selected); + node.childNodes[1].setAttribute('aria-level', obj.parents.length); + if(this.settings.core.compute_elements_positions) { + node.childNodes[1].setAttribute('aria-setsize', m[obj.parent].children.length); + node.childNodes[1].setAttribute('aria-posinset', m[obj.parent].children.indexOf(obj.id) + 1); + } + if(obj.state.disabled) { + node.childNodes[1].setAttribute('aria-disabled', true); + } + + for(i = 0, j = obj.children.length; i < j; i++) { + if(!m[obj.children[i]].state.hidden) { + has_children = true; + break; + } + } + if(obj.parent !== null && m[obj.parent] && !obj.state.hidden) { + i = $.inArray(obj.id, m[obj.parent].children); + last_sibling = obj.id; + if(i !== -1) { + i++; + for(j = m[obj.parent].children.length; i < j; i++) { + if(!m[m[obj.parent].children[i]].state.hidden) { + last_sibling = m[obj.parent].children[i]; + } + if(last_sibling !== obj.id) { + break; + } + } + } + } + + if(obj.state.hidden) { + c += ' jstree-hidden'; + } + if (obj.state.loading) { + c += ' jstree-loading'; + } + if(obj.state.loaded && !has_children) { + c += ' jstree-leaf'; + } + else { + c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed'; + node.childNodes[1].setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded) ); + } + if(last_sibling === obj.id) { + c += ' jstree-last'; + } + node.id = obj.id; + node.className = c; + c = ( obj.state.selected ? ' jstree-clicked' : '') + ( obj.state.disabled ? ' jstree-disabled' : ''); + for(j in obj.a_attr) { + if(obj.a_attr.hasOwnProperty(j)) { + if(j === 'href' && obj.a_attr[j] === '#') { continue; } + if(j !== 'class') { + node.childNodes[1].setAttribute(j, obj.a_attr[j]); + } + else { + c += ' ' + obj.a_attr[j]; + } + } + } + if(c.length) { + node.childNodes[1].className = 'jstree-anchor ' + c; + } + if((obj.icon && obj.icon !== true) || obj.icon === false) { + if(obj.icon === false) { + node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden'; + } + else if(obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) { + node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom'; + } + else { + node.childNodes[1].childNodes[0].style.backgroundImage = 'url("'+obj.icon+'")'; + node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center'; + node.childNodes[1].childNodes[0].style.backgroundSize = 'auto'; + node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom'; + } + } + + if(this.settings.core.force_text) { + node.childNodes[1].appendChild(d.createTextNode(obj.text)); + } + else { + node.childNodes[1].innerHTML += obj.text; + } + + + if(deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) { + k = d.createElement('UL'); + k.setAttribute('role', 'group'); + k.className = 'jstree-children'; + for(i = 0, j = obj.children.length; i < j; i++) { + k.appendChild(this.redraw_node(obj.children[i], deep, true)); + } + node.appendChild(k); + } + if(old) { + node.appendChild(old); + } + if(!is_callback) { + // append back using par / ind + if(!par) { + par = this.element[0]; + } + for(i = 0, j = par.childNodes.length; i < j; i++) { + if(par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) { + tmp = par.childNodes[i]; + break; + } + } + if(!tmp) { + tmp = d.createElement('UL'); + tmp.setAttribute('role', 'group'); + tmp.className = 'jstree-children'; + par.appendChild(tmp); + } + par = tmp; + + if(ind < par.childNodes.length) { + par.insertBefore(node, par.childNodes[ind]); + } + else { + par.appendChild(node); + } + if(f) { + t = this.element[0].scrollTop; + l = this.element[0].scrollLeft; + node.childNodes[1].focus(); + this.element[0].scrollTop = t; + this.element[0].scrollLeft = l; + } + } + if(obj.state.opened && !obj.state.loaded) { + obj.state.opened = false; + setTimeout(function () { + this.open_node(obj.id, false, 0); + }.bind(this), 0); + } + return node; + }, + /** + * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready. + * @name open_node(obj [, callback, animation]) + * @param {mixed} obj the node to open + * @param {Function} callback a function to execute once the node is opened + * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation. + * @trigger open_node.jstree, after_open.jstree, before_open.jstree + */ + open_node : function (obj, callback, animation) { + var t1, t2, d, t; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.open_node(obj[t1], callback, animation); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + animation = animation === undefined ? this.settings.core.animation : animation; + if(!this.is_closed(obj)) { + if(callback) { + callback.call(this, obj, false); + } + return false; + } + if(!this.is_loaded(obj)) { + if(this.is_loading(obj)) { + return setTimeout(function () { + this.open_node(obj, callback, animation); + }.bind(this), 500); + } + this.load_node(obj, function (o, ok) { + return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false); + }); + } + else { + d = this.get_node(obj, true); + t = this; + if(d.length) { + if(animation && d.children(".jstree-children").length) { + d.children(".jstree-children").stop(true, true); + } + if(obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) { + this.draw_children(obj); + //d = this.get_node(obj, true); + } + if(!animation) { + this.trigger('before_open', { "node" : obj }); + d[0].className = d[0].className.replace('jstree-closed', 'jstree-open'); + d[0].childNodes[1].setAttribute("aria-expanded", true); + } + else { + this.trigger('before_open', { "node" : obj }); + d + .children(".jstree-children").css("display","none").end() + .removeClass("jstree-closed").addClass("jstree-open") + .children('.jstree-anchor').attr("aria-expanded", true).end() + .children(".jstree-children").stop(true, true) + .slideDown(animation, function () { + this.style.display = ""; + if (t.element) { + t.trigger("after_open", { "node" : obj }); + } + }); + } + } + obj.state.opened = true; + if(callback) { + callback.call(this, obj, true); + } + if(!d.length) { + /** + * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet) + * @event + * @name before_open.jstree + * @param {Object} node the opened node + */ + this.trigger('before_open', { "node" : obj }); + } + /** + * triggered when a node is opened (if there is an animation it will not be completed yet) + * @event + * @name open_node.jstree + * @param {Object} node the opened node + */ + this.trigger('open_node', { "node" : obj }); + if(!animation || !d.length) { + /** + * triggered when a node is opened and the animation is complete + * @event + * @name after_open.jstree + * @param {Object} node the opened node + */ + this.trigger("after_open", { "node" : obj }); + } + return true; + } + }, + /** + * opens every parent of a node (node should be loaded) + * @name _open_to(obj) + * @param {mixed} obj the node to reveal + * @private + */ + _open_to : function (obj) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + var i, j, p = obj.parents; + for(i = 0, j = p.length; i < j; i+=1) { + if(i !== $.jstree.root) { + this.open_node(p[i], false, 0); + } + } + return $('#' + obj.id.replace($.jstree.idregex,'\\$&'), this.element); + }, + /** + * closes a node, hiding its children + * @name close_node(obj [, animation]) + * @param {mixed} obj the node to close + * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation. + * @trigger close_node.jstree, after_close.jstree + */ + close_node : function (obj, animation) { + var t1, t2, t, d; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.close_node(obj[t1], animation); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + if(this.is_closed(obj)) { + return false; + } + animation = animation === undefined ? this.settings.core.animation : animation; + t = this; + d = this.get_node(obj, true); + + obj.state.opened = false; + /** + * triggered when a node is closed (if there is an animation it will not be complete yet) + * @event + * @name close_node.jstree + * @param {Object} node the closed node + */ + this.trigger('close_node',{ "node" : obj }); + if(!d.length) { + /** + * triggered when a node is closed and the animation is complete + * @event + * @name after_close.jstree + * @param {Object} node the closed node + */ + this.trigger("after_close", { "node" : obj }); + } + else { + if(!animation) { + d[0].className = d[0].className.replace('jstree-open', 'jstree-closed'); + d.children('.jstree-anchor').attr("aria-expanded", false); + d.children('.jstree-children').remove(); + this.trigger("after_close", { "node" : obj }); + } + else { + d + .children(".jstree-children").attr("style","display:block !important").end() + .removeClass("jstree-open").addClass("jstree-closed") + .children('.jstree-anchor').attr("aria-expanded", false).end() + .children(".jstree-children").stop(true, true).slideUp(animation, function () { + this.style.display = ""; + d.children('.jstree-children').remove(); + if (t.element) { + t.trigger("after_close", { "node" : obj }); + } + }); + } + } + }, + /** + * toggles a node - closing it if it is open, opening it if it is closed + * @name toggle_node(obj) + * @param {mixed} obj the node to toggle + */ + toggle_node : function (obj) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.toggle_node(obj[t1]); + } + return true; + } + if(this.is_closed(obj)) { + return this.open_node(obj); + } + if(this.is_open(obj)) { + return this.close_node(obj); + } + }, + /** + * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready. + * @name open_all([obj, animation, original_obj]) + * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree + * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation + * @param {jQuery} reference to the node that started the process (internal use) + * @trigger open_all.jstree + */ + open_all : function (obj, animation, original_obj) { + if(!obj) { obj = $.jstree.root; } + obj = this.get_node(obj); + if(!obj) { return false; } + var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), i, j, _this; + if(!dom.length) { + for(i = 0, j = obj.children_d.length; i < j; i++) { + if(this.is_closed(this._model.data[obj.children_d[i]])) { + this._model.data[obj.children_d[i]].state.opened = true; + } + } + return this.trigger('open_all', { "node" : obj }); + } + original_obj = original_obj || dom; + _this = this; + dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed'); + dom.each(function () { + _this.open_node( + this, + function(node, status) { if(status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } }, + animation || 0 + ); + }); + if(original_obj.find('.jstree-closed').length === 0) { + /** + * triggered when an `open_all` call completes + * @event + * @name open_all.jstree + * @param {Object} node the opened node + */ + this.trigger('open_all', { "node" : this.get_node(original_obj) }); + } + }, + /** + * closes all nodes within a node (or the tree), revealing their children + * @name close_all([obj, animation]) + * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree + * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation + * @trigger close_all.jstree + */ + close_all : function (obj, animation) { + if(!obj) { obj = $.jstree.root; } + obj = this.get_node(obj); + if(!obj) { return false; } + var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), + _this = this, i, j; + if(dom.length) { + dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open'); + $(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); }); + } + for(i = 0, j = obj.children_d.length; i < j; i++) { + this._model.data[obj.children_d[i]].state.opened = false; + } + /** + * triggered when an `close_all` call completes + * @event + * @name close_all.jstree + * @param {Object} node the closed node + */ + this.trigger('close_all', { "node" : obj }); + }, + /** + * checks if a node is disabled (not selectable) + * @name is_disabled(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_disabled : function (obj) { + obj = this.get_node(obj); + return obj && obj.state && obj.state.disabled; + }, + /** + * enables a node - so that it can be selected + * @name enable_node(obj) + * @param {mixed} obj the node to enable + * @trigger enable_node.jstree + */ + enable_node : function (obj) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.enable_node(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + obj.state.disabled = false; + this.get_node(obj,true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false); + /** + * triggered when an node is enabled + * @event + * @name enable_node.jstree + * @param {Object} node the enabled node + */ + this.trigger('enable_node', { 'node' : obj }); + }, + /** + * disables a node - so that it can not be selected + * @name disable_node(obj) + * @param {mixed} obj the node to disable + * @trigger disable_node.jstree + */ + disable_node : function (obj) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.disable_node(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + obj.state.disabled = true; + this.get_node(obj,true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true); + /** + * triggered when an node is disabled + * @event + * @name disable_node.jstree + * @param {Object} node the disabled node + */ + this.trigger('disable_node', { 'node' : obj }); + }, + /** + * determines if a node is hidden + * @name is_hidden(obj) + * @param {mixed} obj the node + */ + is_hidden : function (obj) { + obj = this.get_node(obj); + return obj.state.hidden === true; + }, + /** + * hides a node - it is still in the structure but will not be visible + * @name hide_node(obj) + * @param {mixed} obj the node to hide + * @param {Boolean} skip_redraw internal parameter controlling if redraw is called + * @trigger hide_node.jstree + */ + hide_node : function (obj, skip_redraw) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.hide_node(obj[t1], true); + } + if (!skip_redraw) { + this.redraw(); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + if(!obj.state.hidden) { + obj.state.hidden = true; + this._node_changed(obj.parent); + if(!skip_redraw) { + this.redraw(); + } + /** + * triggered when an node is hidden + * @event + * @name hide_node.jstree + * @param {Object} node the hidden node + */ + this.trigger('hide_node', { 'node' : obj }); + } + }, + /** + * shows a node + * @name show_node(obj) + * @param {mixed} obj the node to show + * @param {Boolean} skip_redraw internal parameter controlling if redraw is called + * @trigger show_node.jstree + */ + show_node : function (obj, skip_redraw) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.show_node(obj[t1], true); + } + if (!skip_redraw) { + this.redraw(); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + if(obj.state.hidden) { + obj.state.hidden = false; + this._node_changed(obj.parent); + if(!skip_redraw) { + this.redraw(); + } + /** + * triggered when an node is shown + * @event + * @name show_node.jstree + * @param {Object} node the shown node + */ + this.trigger('show_node', { 'node' : obj }); + } + }, + /** + * hides all nodes + * @name hide_all() + * @trigger hide_all.jstree + */ + hide_all : function (skip_redraw) { + var i, m = this._model.data, ids = []; + for(i in m) { + if(m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) { + m[i].state.hidden = true; + ids.push(i); + } + } + this._model.force_full_redraw = true; + if(!skip_redraw) { + this.redraw(); + } + /** + * triggered when all nodes are hidden + * @event + * @name hide_all.jstree + * @param {Array} nodes the IDs of all hidden nodes + */ + this.trigger('hide_all', { 'nodes' : ids }); + return ids; + }, + /** + * shows all nodes + * @name show_all() + * @trigger show_all.jstree + */ + show_all : function (skip_redraw) { + var i, m = this._model.data, ids = []; + for(i in m) { + if(m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) { + m[i].state.hidden = false; + ids.push(i); + } + } + this._model.force_full_redraw = true; + if(!skip_redraw) { + this.redraw(); + } + /** + * triggered when all nodes are shown + * @event + * @name show_all.jstree + * @param {Array} nodes the IDs of all shown nodes + */ + this.trigger('show_all', { 'nodes' : ids }); + return ids; + }, + /** + * called when a node is selected by the user. Used internally. + * @private + * @name activate_node(obj, e) + * @param {mixed} obj the node + * @param {Object} e the related event + * @trigger activate_node.jstree, changed.jstree + */ + activate_node : function (obj, e) { + if(this.is_disabled(obj)) { + return false; + } + if(!e || typeof e !== 'object') { + e = {}; + } + + // ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node + this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null; + if(this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; } + if(!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); } + + if(!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent ) )) { + if(!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) { + this.deselect_node(obj, false, e); + } + else { + if (this.settings.core.allow_reselect || !this.is_selected(obj) || this._data.core.selected.length !== 1) { + this.deselect_all(true); + this.select_node(obj, false, false, e); + } + this._data.core.last_clicked = this.get_node(obj); + } + } + else { + if(e.shiftKey) { + var o = this.get_node(obj).id, + l = this._data.core.last_clicked.id, + p = this.get_node(this._data.core.last_clicked.parent).children, + c = false, + i, j; + for(i = 0, j = p.length; i < j; i += 1) { + // separate IFs work whem o and l are the same + if(p[i] === o) { + c = !c; + } + if(p[i] === l) { + c = !c; + } + if(!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) { + if (!this.is_hidden(p[i])) { + this.select_node(p[i], true, false, e); + } + } + else { + if (!e.ctrlKey) { + this.deselect_node(p[i], true, e); + } + } + } + this.trigger('changed', { 'action' : 'select_node', 'node' : this.get_node(obj), 'selected' : this._data.core.selected, 'event' : e }); + } + else { + if(!this.is_selected(obj)) { + if (e.ctrlKey) { + this._data.core.last_clicked = this.get_node(obj); + } + this.select_node(obj, false, false, e); + } + else { + this.deselect_node(obj, false, e); + } + } + } + /** + * triggered when an node is clicked or intercated with by the user + * @event + * @name activate_node.jstree + * @param {Object} node + * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object) + */ + this.trigger('activate_node', { 'node' : this.get_node(obj), 'event' : e }); + }, + /** + * applies the hover state on a node, called when a node is hovered by the user. Used internally. + * @private + * @name hover_node(obj) + * @param {mixed} obj + * @trigger hover_node.jstree + */ + hover_node : function (obj) { + obj = this.get_node(obj, true); + if(!obj || !obj.length || obj.children('.jstree-hovered').length) { + return false; + } + var o = this.element.find('.jstree-hovered'), t = this.element; + if(o && o.length) { this.dehover_node(o); } + + obj.children('.jstree-anchor').addClass('jstree-hovered'); + /** + * triggered when an node is hovered + * @event + * @name hover_node.jstree + * @param {Object} node + */ + this.trigger('hover_node', { 'node' : this.get_node(obj) }); + setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0); + }, + /** + * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally. + * @private + * @name dehover_node(obj) + * @param {mixed} obj + * @trigger dehover_node.jstree + */ + dehover_node : function (obj) { + obj = this.get_node(obj, true); + if(!obj || !obj.length || !obj.children('.jstree-hovered').length) { + return false; + } + obj.children('.jstree-anchor').removeClass('jstree-hovered'); + /** + * triggered when an node is no longer hovered + * @event + * @name dehover_node.jstree + * @param {Object} node + */ + this.trigger('dehover_node', { 'node' : this.get_node(obj) }); + }, + /** + * select a node + * @name select_node(obj [, supress_event, prevent_open]) + * @param {mixed} obj an array can be used to select multiple nodes + * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered + * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened + * @trigger select_node.jstree, changed.jstree + */ + select_node : function (obj, supress_event, prevent_open, e) { + var dom, t1, t2, th; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.select_node(obj[t1], supress_event, prevent_open, e); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(!obj.state.selected) { + obj.state.selected = true; + this._data.core.selected.push(obj.id); + if(!prevent_open) { + dom = this._open_to(obj); + } + if(dom && dom.length) { + dom.children('.jstree-anchor').addClass('jstree-clicked').attr('aria-selected', true); + } + /** + * triggered when an node is selected + * @event + * @name select_node.jstree + * @param {Object} node + * @param {Array} selected the current selection + * @param {Object} event the event (if any) that triggered this select_node + */ + this.trigger('select_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); + if(!supress_event) { + /** + * triggered when selection changes + * @event + * @name changed.jstree + * @param {Object} node + * @param {Object} action the action that caused the selection to change + * @param {Array} selected the current selection + * @param {Object} event the event (if any) that triggered this changed event + */ + this.trigger('changed', { 'action' : 'select_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); + } + } + }, + /** + * deselect a node + * @name deselect_node(obj [, supress_event]) + * @param {mixed} obj an array can be used to deselect multiple nodes + * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered + * @trigger deselect_node.jstree, changed.jstree + */ + deselect_node : function (obj, supress_event, e) { + var t1, t2, dom; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.deselect_node(obj[t1], supress_event, e); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(obj.state.selected) { + obj.state.selected = false; + this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id); + if(dom.length) { + dom.children('.jstree-anchor').removeClass('jstree-clicked').attr('aria-selected', false); + } + /** + * triggered when an node is deselected + * @event + * @name deselect_node.jstree + * @param {Object} node + * @param {Array} selected the current selection + * @param {Object} event the event (if any) that triggered this deselect_node + */ + this.trigger('deselect_node', { 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); + if(!supress_event) { + this.trigger('changed', { 'action' : 'deselect_node', 'node' : obj, 'selected' : this._data.core.selected, 'event' : e }); + } + } + }, + /** + * select all nodes in the tree + * @name select_all([supress_event]) + * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered + * @trigger select_all.jstree, changed.jstree + */ + select_all : function (supress_event) { + var tmp = this._data.core.selected.concat([]), i, j; + this._data.core.selected = this._model.data[$.jstree.root].children_d.concat(); + for(i = 0, j = this._data.core.selected.length; i < j; i++) { + if(this._model.data[this._data.core.selected[i]]) { + this._model.data[this._data.core.selected[i]].state.selected = true; + } + } + this.redraw(true); + /** + * triggered when all nodes are selected + * @event + * @name select_all.jstree + * @param {Array} selected the current selection + */ + this.trigger('select_all', { 'selected' : this._data.core.selected }); + if(!supress_event) { + this.trigger('changed', { 'action' : 'select_all', 'selected' : this._data.core.selected, 'old_selection' : tmp }); + } + }, + /** + * deselect all selected nodes + * @name deselect_all([supress_event]) + * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered + * @trigger deselect_all.jstree, changed.jstree + */ + deselect_all : function (supress_event) { + var tmp = this._data.core.selected.concat([]), i, j; + for(i = 0, j = this._data.core.selected.length; i < j; i++) { + if(this._model.data[this._data.core.selected[i]]) { + this._model.data[this._data.core.selected[i]].state.selected = false; + } + } + this._data.core.selected = []; + this.element.find('.jstree-clicked').removeClass('jstree-clicked').attr('aria-selected', false); + /** + * triggered when all nodes are deselected + * @event + * @name deselect_all.jstree + * @param {Object} node the previous selection + * @param {Array} selected the current selection + */ + this.trigger('deselect_all', { 'selected' : this._data.core.selected, 'node' : tmp }); + if(!supress_event) { + this.trigger('changed', { 'action' : 'deselect_all', 'selected' : this._data.core.selected, 'old_selection' : tmp }); + } + }, + /** + * checks if a node is selected + * @name is_selected(obj) + * @param {mixed} obj + * @return {Boolean} + */ + is_selected : function (obj) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + return obj.state.selected; + }, + /** + * get an array of all selected nodes + * @name get_selected([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + */ + get_selected : function (full) { + return full ? $.map(this._data.core.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.core.selected.slice(); + }, + /** + * get an array of all top level selected nodes (ignoring children of selected nodes) + * @name get_top_selected([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + */ + get_top_selected : function (full) { + var tmp = this.get_selected(true), + obj = {}, i, j, k, l; + for(i = 0, j = tmp.length; i < j; i++) { + obj[tmp[i].id] = tmp[i]; + } + for(i = 0, j = tmp.length; i < j; i++) { + for(k = 0, l = tmp[i].children_d.length; k < l; k++) { + if(obj[tmp[i].children_d[k]]) { + delete obj[tmp[i].children_d[k]]; + } + } + } + tmp = []; + for(i in obj) { + if(obj.hasOwnProperty(i)) { + tmp.push(i); + } + } + return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp; + }, + /** + * get an array of all bottom level selected nodes (ignoring selected parents) + * @name get_bottom_selected([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + */ + get_bottom_selected : function (full) { + var tmp = this.get_selected(true), + obj = [], i, j; + for(i = 0, j = tmp.length; i < j; i++) { + if(!tmp[i].children.length) { + obj.push(tmp[i].id); + } + } + return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj; + }, + /** + * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally. + * @name get_state() + * @private + * @return {Object} + */ + get_state : function () { + var state = { + 'core' : { + 'open' : [], + 'loaded' : [], + 'scroll' : { + 'left' : this.element.scrollLeft(), + 'top' : this.element.scrollTop() + }, + /*! + 'themes' : { + 'name' : this.get_theme(), + 'icons' : this._data.core.themes.icons, + 'dots' : this._data.core.themes.dots + }, + */ + 'selected' : [] + } + }, i; + for(i in this._model.data) { + if(this._model.data.hasOwnProperty(i)) { + if(i !== $.jstree.root) { + if(this._model.data[i].state.loaded && this.settings.core.loaded_state) { + state.core.loaded.push(i); + } + if(this._model.data[i].state.opened) { + state.core.open.push(i); + } + if(this._model.data[i].state.selected) { + state.core.selected.push(i); + } + } + } + } + return state; + }, + /** + * sets the state of the tree. Used internally. + * @name set_state(state [, callback]) + * @private + * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it. + * @param {Function} callback an optional function to execute once the state is restored. + * @trigger set_state.jstree + */ + set_state : function (state, callback) { + if(state) { + if(state.core && state.core.selected && state.core.initial_selection === undefined) { + state.core.initial_selection = this._data.core.selected.concat([]).sort().join(','); + } + if(state.core) { + var res, n, t, _this, i; + if(state.core.loaded) { + if(!this.settings.core.loaded_state || !$.vakata.is_array(state.core.loaded) || !state.core.loaded.length) { + delete state.core.loaded; + this.set_state(state, callback); + } + else { + this._load_nodes(state.core.loaded, function (nodes) { + delete state.core.loaded; + this.set_state(state, callback); + }); + } + return false; + } + if(state.core.open) { + if(!$.vakata.is_array(state.core.open) || !state.core.open.length) { + delete state.core.open; + this.set_state(state, callback); + } + else { + this._load_nodes(state.core.open, function (nodes) { + this.open_node(nodes, false, 0); + delete state.core.open; + this.set_state(state, callback); + }); + } + return false; + } + if(state.core.scroll) { + if(state.core.scroll && state.core.scroll.left !== undefined) { + this.element.scrollLeft(state.core.scroll.left); + } + if(state.core.scroll && state.core.scroll.top !== undefined) { + this.element.scrollTop(state.core.scroll.top); + } + delete state.core.scroll; + this.set_state(state, callback); + return false; + } + if(state.core.selected) { + _this = this; + if (state.core.initial_selection === undefined || + state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',') + ) { + this.deselect_all(); + $.each(state.core.selected, function (i, v) { + _this.select_node(v, false, true); + }); + } + delete state.core.initial_selection; + delete state.core.selected; + this.set_state(state, callback); + return false; + } + for(i in state) { + if(state.hasOwnProperty(i) && i !== "core" && $.inArray(i, this.settings.plugins) === -1) { + delete state[i]; + } + } + if($.isEmptyObject(state.core)) { + delete state.core; + this.set_state(state, callback); + return false; + } + } + if($.isEmptyObject(state)) { + state = null; + if(callback) { callback.call(this); } + /** + * triggered when a `set_state` call completes + * @event + * @name set_state.jstree + */ + this.trigger('set_state'); + return false; + } + return true; + } + return false; + }, + /** + * refreshes the tree - all nodes are reloaded with calls to `load_node`. + * @name refresh() + * @param {Boolean} skip_loading an option to skip showing the loading indicator + * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state + * @trigger refresh.jstree + */ + refresh : function (skip_loading, forget_state) { + this._data.core.state = forget_state === true ? {} : this.get_state(); + if(forget_state && $.vakata.is_function(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); } + this._cnt = 0; + this._model.data = {}; + this._model.data[$.jstree.root] = { + id : $.jstree.root, + parent : null, + parents : [], + children : [], + children_d : [], + state : { loaded : false } + }; + this._data.core.selected = []; + this._data.core.last_clicked = null; + this._data.core.focused = null; + + var c = this.get_container_ul()[0].className; + if(!skip_loading) { + this.element.html("<"+"ul class='"+c+"' role='group'><"+"li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='none' id='j"+this._id+"_loading'><"+"a class='jstree-anchor' role='treeitem' href='#'>" + this.get_string("Loading ...") + ""); + this.element.attr('aria-activedescendant','j'+this._id+'_loading'); + } + this.load_node($.jstree.root, function (o, s) { + if(s) { + this.get_container_ul()[0].className = c; + if(this._firstChild(this.get_container_ul()[0])) { + this.element.attr('aria-activedescendant',this._firstChild(this.get_container_ul()[0]).id); + } + this.set_state($.extend(true, {}, this._data.core.state), function () { + /** + * triggered when a `refresh` call completes + * @event + * @name refresh.jstree + */ + this.trigger('refresh'); + }); + } + this._data.core.state = null; + }); + }, + /** + * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`. + * @name refresh_node(obj) + * @param {mixed} obj the node + * @trigger refresh_node.jstree + */ + refresh_node : function (obj) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + var opened = [], to_load = [], s = this._data.core.selected.concat([]); + to_load.push(obj.id); + if(obj.state.opened === true) { opened.push(obj.id); } + this.get_node(obj, true).find('.jstree-open').each(function() { to_load.push(this.id); opened.push(this.id); }); + this._load_nodes(to_load, function (nodes) { + this.open_node(opened, false, 0); + this.select_node(s); + /** + * triggered when a node is refreshed + * @event + * @name refresh_node.jstree + * @param {Object} node - the refreshed node + * @param {Array} nodes - an array of the IDs of the nodes that were reloaded + */ + this.trigger('refresh_node', { 'node' : obj, 'nodes' : nodes }); + }.bind(this), false, true); + }, + /** + * set (change) the ID of a node + * @name set_id(obj, id) + * @param {mixed} obj the node + * @param {String} id the new ID + * @return {Boolean} + * @trigger set_id.jstree + */ + set_id : function (obj, id) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + var i, j, m = this._model.data, old = obj.id; + id = id.toString(); + // update parents (replace current ID with new one in children and children_d) + m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id; + for(i = 0, j = obj.parents.length; i < j; i++) { + m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id; + } + // update children (replace current ID with new one in parent and parents) + for(i = 0, j = obj.children.length; i < j; i++) { + m[obj.children[i]].parent = id; + } + for(i = 0, j = obj.children_d.length; i < j; i++) { + m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id; + } + i = $.inArray(obj.id, this._data.core.selected); + if(i !== -1) { this._data.core.selected[i] = id; } + // update model and obj itself (obj.id, this._model.data[KEY]) + i = this.get_node(obj.id, true); + if(i) { + i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor'); + if(this.element.attr('aria-activedescendant') === obj.id) { + this.element.attr('aria-activedescendant', id); + } + } + delete m[obj.id]; + obj.id = id; + obj.li_attr.id = id; + m[id] = obj; + /** + * triggered when a node id value is changed + * @event + * @name set_id.jstree + * @param {Object} node + * @param {String} old the old id + */ + this.trigger('set_id',{ "node" : obj, "new" : obj.id, "old" : old }); + return true; + }, + /** + * get the text value of a node + * @name get_text(obj) + * @param {mixed} obj the node + * @return {String} + */ + get_text : function (obj) { + obj = this.get_node(obj); + return (!obj || obj.id === $.jstree.root) ? false : obj.text; + }, + /** + * set the text value of a node. Used internally, please use `rename_node(obj, val)`. + * @private + * @name set_text(obj, val) + * @param {mixed} obj the node, you can pass an array to set the text on multiple nodes + * @param {String} val the new text value + * @return {Boolean} + * @trigger set_text.jstree + */ + set_text : function (obj, val) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.set_text(obj[t1], val); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + obj.text = val; + if(this.get_node(obj, true).length) { + this.redraw_node(obj.id); + } + /** + * triggered when a node text value is changed + * @event + * @name set_text.jstree + * @param {Object} obj + * @param {String} text the new value + */ + this.trigger('set_text',{ "obj" : obj, "text" : val }); + return true; + }, + /** + * gets a JSON representation of a node (or the whole tree) + * @name get_json([obj, options]) + * @param {mixed} obj + * @param {Object} options + * @param {Boolean} options.no_state do not return state information + * @param {Boolean} options.no_id do not return ID + * @param {Boolean} options.no_children do not include children + * @param {Boolean} options.no_data do not include node data + * @param {Boolean} options.no_li_attr do not include LI attributes + * @param {Boolean} options.no_a_attr do not include A attributes + * @param {Boolean} options.flat return flat JSON instead of nested + * @return {Object} + */ + get_json : function (obj, options, flat) { + obj = this.get_node(obj || $.jstree.root); + if(!obj) { return false; } + if(options && options.flat && !flat) { flat = []; } + var tmp = { + 'id' : obj.id, + 'text' : obj.text, + 'icon' : this.get_icon(obj), + 'li_attr' : $.extend(true, {}, obj.li_attr), + 'a_attr' : $.extend(true, {}, obj.a_attr), + 'state' : {}, + 'data' : options && options.no_data ? false : $.extend(true, $.vakata.is_array(obj.data)?[]:{}, obj.data) + //( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ), + }, i, j; + if(options && options.flat) { + tmp.parent = obj.parent; + } + else { + tmp.children = []; + } + if(!options || !options.no_state) { + for(i in obj.state) { + if(obj.state.hasOwnProperty(i)) { + tmp.state[i] = obj.state[i]; + } + } + } else { + delete tmp.state; + } + if(options && options.no_li_attr) { + delete tmp.li_attr; + } + if(options && options.no_a_attr) { + delete tmp.a_attr; + } + if(options && options.no_id) { + delete tmp.id; + if(tmp.li_attr && tmp.li_attr.id) { + delete tmp.li_attr.id; + } + if(tmp.a_attr && tmp.a_attr.id) { + delete tmp.a_attr.id; + } + } + if(options && options.flat && obj.id !== $.jstree.root) { + flat.push(tmp); + } + if(!options || !options.no_children) { + for(i = 0, j = obj.children.length; i < j; i++) { + if(options && options.flat) { + this.get_json(obj.children[i], options, flat); + } + else { + tmp.children.push(this.get_json(obj.children[i], options)); + } + } + } + return options && options.flat ? flat : (obj.id === $.jstree.root ? tmp.children : tmp); + }, + /** + * create a new node (do not confuse with load_node) + * @name create_node([par, node, pos, callback, is_loaded]) + * @param {mixed} par the parent node (to create a root node use either "#" (string) or `null`) + * @param {mixed} node the data for the new node (a valid JSON object, or a simple string with the name) + * @param {mixed} pos the index at which to insert the node, "first" and "last" are also supported, default is "last" + * @param {Function} callback a function to be called once the node is created + * @param {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded + * @return {String} the ID of the newly create node + * @trigger model.jstree, create_node.jstree + */ + create_node : function (par, node, pos, callback, is_loaded) { + if(par === null) { par = $.jstree.root; } + par = this.get_node(par); + if(!par) { return false; } + pos = pos === undefined ? "last" : pos; + if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { + return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); }); + } + if(!node) { node = { "text" : this.get_string('New node') }; } + if(typeof node === "string") { + node = { "text" : node }; + } else { + node = $.extend(true, {}, node); + } + if(node.text === undefined) { node.text = this.get_string('New node'); } + var tmp, dpc, i, j; + + if(par.id === $.jstree.root) { + if(pos === "before") { pos = "first"; } + if(pos === "after") { pos = "last"; } + } + switch(pos) { + case "before": + tmp = this.get_node(par.parent); + pos = $.inArray(par.id, tmp.children); + par = tmp; + break; + case "after" : + tmp = this.get_node(par.parent); + pos = $.inArray(par.id, tmp.children) + 1; + par = tmp; + break; + case "inside": + case "first": + pos = 0; + break; + case "last": + pos = par.children.length; + break; + default: + if(!pos) { pos = 0; } + break; + } + if(pos > par.children.length) { pos = par.children.length; } + if(node.id === undefined) { node.id = true; } + if(!this.check("create_node", node, par, pos)) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + if(node.id === true) { delete node.id; } + node = this._parse_model_from_json(node, par.id, par.parents.concat()); + if(!node) { return false; } + tmp = this.get_node(node); + dpc = []; + dpc.push(node); + dpc = dpc.concat(tmp.children_d); + this.trigger('model', { "nodes" : dpc, "parent" : par.id }); + + par.children_d = par.children_d.concat(dpc); + for(i = 0, j = par.parents.length; i < j; i++) { + this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc); + } + node = tmp; + tmp = []; + for(i = 0, j = par.children.length; i < j; i++) { + tmp[i >= pos ? i+1 : i] = par.children[i]; + } + tmp[pos] = node.id; + par.children = tmp; + + this.redraw_node(par, true); + /** + * triggered when a node is created + * @event + * @name create_node.jstree + * @param {Object} node + * @param {String} parent the parent's ID + * @param {Number} position the position of the new node among the parent's children + */ + this.trigger('create_node', { "node" : this.get_node(node), "parent" : par.id, "position" : pos }); + if(callback) { callback.call(this, this.get_node(node)); } + return node.id; + }, + /** + * set the text value of a node + * @name rename_node(obj, val) + * @param {mixed} obj the node, you can pass an array to rename multiple nodes to the same name + * @param {String} val the new text value + * @return {Boolean} + * @trigger rename_node.jstree + */ + rename_node : function (obj, val) { + var t1, t2, old; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.rename_node(obj[t1], val); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + old = obj.text; + if(!this.check("rename_node", obj, this.get_parent(obj), val)) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments)) + /** + * triggered when a node is renamed + * @event + * @name rename_node.jstree + * @param {Object} node + * @param {String} text the new value + * @param {String} old the old value + */ + this.trigger('rename_node', { "node" : obj, "text" : val, "old" : old }); + return true; + }, + /** + * remove a node + * @name delete_node(obj) + * @param {mixed} obj the node, you can pass an array to delete multiple nodes + * @return {Boolean} + * @trigger delete_node.jstree, changed.jstree + */ + delete_node : function (obj) { + var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.delete_node(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + par = this.get_node(obj.parent); + pos = $.inArray(obj.id, par.children); + c = false; + if(!this.check("delete_node", obj, par, pos)) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + if(pos !== -1) { + par.children = $.vakata.array_remove(par.children, pos); + } + tmp = obj.children_d.concat([]); + tmp.push(obj.id); + for(i = 0, j = obj.parents.length; i < j; i++) { + this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { + return $.inArray(v, tmp) === -1; + }); + } + for(k = 0, l = tmp.length; k < l; k++) { + if(this._model.data[tmp[k]].state.selected) { + c = true; + break; + } + } + if (c) { + this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { + return $.inArray(v, tmp) === -1; + }); + } + /** + * triggered when a node is deleted + * @event + * @name delete_node.jstree + * @param {Object} node + * @param {String} parent the parent's ID + */ + this.trigger('delete_node', { "node" : obj, "parent" : par.id }); + if(c) { + this.trigger('changed', { 'action' : 'delete_node', 'node' : obj, 'selected' : this._data.core.selected, 'parent' : par.id }); + } + for(k = 0, l = tmp.length; k < l; k++) { + delete this._model.data[tmp[k]]; + } + if($.inArray(this._data.core.focused, tmp) !== -1) { + this._data.core.focused = null; + top = this.element[0].scrollTop; + lft = this.element[0].scrollLeft; + if(par.id === $.jstree.root) { + if (this._model.data[$.jstree.root].children[0]) { + this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').trigger('focus'); + } + } + else { + this.get_node(par, true).children('.jstree-anchor').trigger('focus'); + } + this.element[0].scrollTop = top; + this.element[0].scrollLeft = lft; + } + this.redraw_node(par, true); + return true; + }, + /** + * check if an operation is premitted on the tree. Used internally. + * @private + * @name check(chk, obj, par, pos) + * @param {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node" + * @param {mixed} obj the node + * @param {mixed} par the parent + * @param {mixed} pos the position to insert at, or if "rename_node" - the new name + * @param {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node + * @return {Boolean} + */ + check : function (chk, obj, par, pos, more) { + obj = obj && obj.id ? obj : this.get_node(obj); + par = par && par.id ? par : this.get_node(par); + var tmp = chk.match(/^(move_node|copy_node|create_node)$/i) ? par : obj, + chc = this.settings.core.check_callback; + if(chk === "move_node" || chk === "copy_node") { + if((!more || !more.is_multi) && (chk === "move_node" && $.inArray(obj.id, par.children) === pos)) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_08', 'reason' : 'Moving node to its current position', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; + return false; + } + if((!more || !more.is_multi) && (obj.id === par.id || (chk === "move_node" && $.inArray(obj.id, par.children) === pos) || $.inArray(par.id, obj.children_d) !== -1)) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_01', 'reason' : 'Moving parent inside child', 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; + return false; + } + } + if(tmp && tmp.data) { tmp = tmp.data; } + if(tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) { + if(tmp.functions[chk] === false) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_02', 'reason' : 'Node data prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; + } + return tmp.functions[chk]; + } + if(chc === false || ($.vakata.is_function(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'core', 'id' : 'core_03', 'reason' : 'User config for core.check_callback prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; + return false; + } + return true; + }, + /** + * get the last error + * @name last_error() + * @return {Object} + */ + last_error : function () { + return this._data.core.last_error; + }, + /** + * move a node to a new parent + * @name move_node(obj, par [, pos, callback, is_loaded]) + * @param {mixed} obj the node to move, pass an array to move multiple nodes + * @param {mixed} par the new parent + * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` + * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position + * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded + * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn + * @param {Boolean} instance internal parameter indicating if the node comes from another instance + * @trigger move_node.jstree + */ + move_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { + var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p; + + par = this.get_node(par); + pos = pos === undefined ? 0 : pos; + if(!par) { return false; } + if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { + return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true, false, origin); }); + } + + if($.vakata.is_array(obj)) { + if(obj.length === 1) { + obj = obj[0]; + } + else { + //obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + if((tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin))) { + par = tmp; + pos = "after"; + } + } + this.redraw(); + return true; + } + } + obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj); + + if(!obj || obj.id === $.jstree.root) { return false; } + + old_par = (obj.parent || $.jstree.root).toString(); + new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); + old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); + is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); + old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1; + if(old_ins && old_ins._id) { + obj = old_ins._model.data[obj.id]; + } + + if(is_multi) { + if((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) { + if(old_ins) { old_ins.delete_node(obj); } + return tmp; + } + return false; + } + //var m = this._model.data; + if(par.id === $.jstree.root) { + if(pos === "before") { pos = "first"; } + if(pos === "after") { pos = "last"; } + } + switch(pos) { + case "before": + pos = $.inArray(par.id, new_par.children); + break; + case "after" : + pos = $.inArray(par.id, new_par.children) + 1; + break; + case "inside": + case "first": + pos = 0; + break; + case "last": + pos = new_par.children.length; + break; + default: + if(!pos) { pos = 0; } + break; + } + if(pos > new_par.children.length) { pos = new_par.children.length; } + if(!this.check("move_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + if(obj.parent === new_par.id) { + dpc = new_par.children.concat(); + tmp = $.inArray(obj.id, dpc); + if(tmp !== -1) { + dpc = $.vakata.array_remove(dpc, tmp); + if(pos > tmp) { pos--; } + } + tmp = []; + for(i = 0, j = dpc.length; i < j; i++) { + tmp[i >= pos ? i+1 : i] = dpc[i]; + } + tmp[pos] = obj.id; + new_par.children = tmp; + this._node_changed(new_par.id); + this.redraw(new_par.id === $.jstree.root); + } + else { + // clean old parent and up + tmp = obj.children_d.concat(); + tmp.push(obj.id); + for(i = 0, j = obj.parents.length; i < j; i++) { + dpc = []; + p = old_ins._model.data[obj.parents[i]].children_d; + for(k = 0, l = p.length; k < l; k++) { + if($.inArray(p[k], tmp) === -1) { + dpc.push(p[k]); + } + } + old_ins._model.data[obj.parents[i]].children_d = dpc; + } + old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id); + + // insert into new parent and up + for(i = 0, j = new_par.parents.length; i < j; i++) { + this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp); + } + dpc = []; + for(i = 0, j = new_par.children.length; i < j; i++) { + dpc[i >= pos ? i+1 : i] = new_par.children[i]; + } + dpc[pos] = obj.id; + new_par.children = dpc; + new_par.children_d.push(obj.id); + new_par.children_d = new_par.children_d.concat(obj.children_d); + + // update object + obj.parent = new_par.id; + tmp = new_par.parents.concat(); + tmp.unshift(new_par.id); + p = obj.parents.length; + obj.parents = tmp; + + // update object children + tmp = tmp.concat(); + for(i = 0, j = obj.children_d.length; i < j; i++) { + this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0,p*-1); + Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp); + } + + if(old_par === $.jstree.root || new_par.id === $.jstree.root) { + this._model.force_full_redraw = true; + } + if(!this._model.force_full_redraw) { + this._node_changed(old_par); + this._node_changed(new_par.id); + } + if(!skip_redraw) { + this.redraw(); + } + } + if(callback) { callback.call(this, obj, new_par, pos); } + /** + * triggered when a node is moved + * @event + * @name move_node.jstree + * @param {Object} node + * @param {String} parent the parent's ID + * @param {Number} position the position of the node among the parent's children + * @param {String} old_parent the old parent of the node + * @param {Number} old_position the old position of the node + * @param {Boolean} is_multi do the node and new parent belong to different instances + * @param {jsTree} old_instance the instance the node came from + * @param {jsTree} new_instance the instance of the new parent + */ + this.trigger('move_node', { "node" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_pos, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this }); + return obj.id; + }, + /** + * copy a node to a new parent + * @name copy_node(obj, par [, pos, callback, is_loaded]) + * @param {mixed} obj the node to copy, pass an array to copy multiple nodes + * @param {mixed} par the new parent + * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` + * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position + * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded + * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn + * @param {Boolean} instance internal parameter indicating if the node comes from another instance + * @trigger model.jstree copy_node.jstree + */ + copy_node : function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { + var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi; + + par = this.get_node(par); + pos = pos === undefined ? 0 : pos; + if(!par) { return false; } + if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { + return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); }); + } + + if($.vakata.is_array(obj)) { + if(obj.length === 1) { + obj = obj[0]; + } + else { + //obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + if((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) { + par = tmp; + pos = "after"; + } + } + this.redraw(); + return true; + } + } + obj = obj && (obj.id !== undefined) ? obj : this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + + old_par = (obj.parent || $.jstree.root).toString(); + new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); + old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); + is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); + + if(old_ins && old_ins._id) { + obj = old_ins._model.data[obj.id]; + } + + if(par.id === $.jstree.root) { + if(pos === "before") { pos = "first"; } + if(pos === "after") { pos = "last"; } + } + switch(pos) { + case "before": + pos = $.inArray(par.id, new_par.children); + break; + case "after" : + pos = $.inArray(par.id, new_par.children) + 1; + break; + case "inside": + case "first": + pos = 0; + break; + case "last": + pos = new_par.children.length; + break; + default: + if(!pos) { pos = 0; } + break; + } + if(pos > new_par.children.length) { pos = new_par.children.length; } + if(!this.check("copy_node", obj, new_par, pos, { 'core' : true, 'origin' : origin, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id) })) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj; + if(!node) { return false; } + if(node.id === true) { delete node.id; } + node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat()); + if(!node) { return false; } + tmp = this.get_node(node); + if(obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; } + dpc = []; + dpc.push(node); + dpc = dpc.concat(tmp.children_d); + this.trigger('model', { "nodes" : dpc, "parent" : new_par.id }); + + // insert into new parent and up + for(i = 0, j = new_par.parents.length; i < j; i++) { + this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc); + } + dpc = []; + for(i = 0, j = new_par.children.length; i < j; i++) { + dpc[i >= pos ? i+1 : i] = new_par.children[i]; + } + dpc[pos] = tmp.id; + new_par.children = dpc; + new_par.children_d.push(tmp.id); + new_par.children_d = new_par.children_d.concat(tmp.children_d); + + if(new_par.id === $.jstree.root) { + this._model.force_full_redraw = true; + } + if(!this._model.force_full_redraw) { + this._node_changed(new_par.id); + } + if(!skip_redraw) { + this.redraw(new_par.id === $.jstree.root); + } + if(callback) { callback.call(this, tmp, new_par, pos); } + /** + * triggered when a node is copied + * @event + * @name copy_node.jstree + * @param {Object} node the copied node + * @param {Object} original the original node + * @param {String} parent the parent's ID + * @param {Number} position the position of the node among the parent's children + * @param {String} old_parent the old parent of the node + * @param {Number} old_position the position of the original node + * @param {Boolean} is_multi do the node and new parent belong to different instances + * @param {jsTree} old_instance the instance the node came from + * @param {jsTree} new_instance the instance of the new parent + */ + this.trigger('copy_node', { "node" : tmp, "original" : obj, "parent" : new_par.id, "position" : pos, "old_parent" : old_par, "old_position" : old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1,'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this }); + return tmp.id; + }, + /** + * cut a node (a later call to `paste(obj)` would move the node) + * @name cut(obj) + * @param {mixed} obj multiple objects can be passed using an array + * @trigger cut.jstree + */ + cut : function (obj) { + if(!obj) { obj = this._data.core.selected.concat(); } + if(!$.vakata.is_array(obj)) { obj = [obj]; } + if(!obj.length) { return false; } + var tmp = [], o, t1, t2; + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + o = this.get_node(obj[t1]); + if(o && (o.id || o.id === 0) && o.id !== $.jstree.root) { tmp.push(o); } + } + if(!tmp.length) { return false; } + ccp_node = tmp; + ccp_inst = this; + ccp_mode = 'move_node'; + /** + * triggered when nodes are added to the buffer for moving + * @event + * @name cut.jstree + * @param {Array} node + */ + this.trigger('cut', { "node" : obj }); + }, + /** + * copy a node (a later call to `paste(obj)` would copy the node) + * @name copy(obj) + * @param {mixed} obj multiple objects can be passed using an array + * @trigger copy.jstree + */ + copy : function (obj) { + if(!obj) { obj = this._data.core.selected.concat(); } + if(!$.vakata.is_array(obj)) { obj = [obj]; } + if(!obj.length) { return false; } + var tmp = [], o, t1, t2; + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + o = this.get_node(obj[t1]); + if(o && (o.id !== undefined) && o.id !== $.jstree.root) { tmp.push(o); } + } + if(!tmp.length) { return false; } + ccp_node = tmp; + ccp_inst = this; + ccp_mode = 'copy_node'; + /** + * triggered when nodes are added to the buffer for copying + * @event + * @name copy.jstree + * @param {Array} node + */ + this.trigger('copy', { "node" : obj }); + }, + /** + * get the current buffer (any nodes that are waiting for a paste operation) + * @name get_buffer() + * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance) + */ + get_buffer : function () { + return { 'mode' : ccp_mode, 'node' : ccp_node, 'inst' : ccp_inst }; + }, + /** + * check if there is something in the buffer to paste + * @name can_paste() + * @return {Boolean} + */ + can_paste : function () { + return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node]; + }, + /** + * copy or move the previously cut or copied nodes to a new parent + * @name paste(obj [, pos]) + * @param {mixed} obj the new parent + * @param {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0` + * @trigger paste.jstree + */ + paste : function (obj, pos) { + obj = this.get_node(obj); + if(!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; } + if(this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) { + /** + * triggered when paste is invoked + * @event + * @name paste.jstree + * @param {String} parent the ID of the receiving node + * @param {Array} node the nodes in the buffer + * @param {String} mode the performed operation - "copy_node" or "move_node" + */ + this.trigger('paste', { "parent" : obj.id, "node" : ccp_node, "mode" : ccp_mode }); + } + ccp_node = false; + ccp_mode = false; + ccp_inst = false; + }, + /** + * clear the buffer of previously copied or cut nodes + * @name clear_buffer() + * @trigger clear_buffer.jstree + */ + clear_buffer : function () { + ccp_node = false; + ccp_mode = false; + ccp_inst = false; + /** + * triggered when the copy / cut buffer is cleared + * @event + * @name clear_buffer.jstree + */ + this.trigger('clear_buffer'); + }, + /** + * put a node in edit mode (input field to rename the node) + * @name edit(obj [, default_text, callback]) + * @param {mixed} obj + * @param {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used) + * @param {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise), a boolean indicating if the user cancelled the edit and the original unescaped value provided by the user. You can also access the node's title using .text + */ + edit : function (obj, default_text, callback) { + var rtl, w, a, s, t, h1, h2, fn, tmp, cancel = false; + obj = this.get_node(obj); + if(!obj) { return false; } + if(!this.check("edit", obj, this.get_parent(obj))) { + this.settings.core.error.call(this, this._data.core.last_error); + return false; + } + tmp = obj; + default_text = typeof default_text === 'string' ? default_text : obj.text; + this.set_text(obj, ""); + obj = this._open_to(obj); + tmp.text = default_text; + + rtl = this._data.core.rtl; + w = this.element.width(); + this._data.core.focused = tmp.id; + a = obj.children('.jstree-anchor').trigger('focus'); + s = $(''); + /*! + oi = obj.children("i:visible"), + ai = a.children("i:visible"), + w1 = oi.width() * oi.length, + w2 = ai.width() * ai.length, + */ + t = default_text; + h1 = $("<"+"div>
", { css : { "position" : "absolute", "top" : "-200px", "left" : (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo(document.body); + h2 = $("<"+"input />", { + "value" : t, + "class" : "jstree-rename-input", + // "size" : t.length, + "css" : { + "padding" : "0", + "border" : "1px solid silver", + "box-sizing" : "border-box", + "display" : "inline-block", + "height" : (this._data.core.li_height) + "px", + "lineHeight" : (this._data.core.li_height) + "px", + "width" : "150px" // will be set a bit further down + }, + "on" : { + "blur" : function (e) { + e.stopImmediatePropagation(); + e.preventDefault(); + var i = s.children(".jstree-rename-input"), + v = i.val(), + f = this.settings.core.force_text, + nv; + if(v === "") { v = t; } + h1.remove(); + s.replaceWith(a); + s.remove(); + t = f ? t : $('
').append($.parseHTML(t)).html(); + obj = this.get_node(obj); + this.set_text(obj, t); + nv = !!this.rename_node(obj, f ? $('
').text(v).text() : $('
').append($.parseHTML(v)).html()); + if(!nv) { + this.set_text(obj, t); // move this up? and fix #483 + } + this._data.core.focused = tmp.id; + setTimeout(function () { + var node = this.get_node(tmp.id, true); + if(node.length) { + this._data.core.focused = tmp.id; + node.children('.jstree-anchor').trigger('focus'); + } + }.bind(this), 0); + if(callback) { + callback.call(this, tmp, nv, cancel, v); + } + h2 = null; + }.bind(this), + "keydown" : function (e) { + var key = e.which; + if(key === 27) { + cancel = true; + this.value = t; + } + if(key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) { + e.stopImmediatePropagation(); + } + if(key === 27 || key === 13) { + e.preventDefault(); + this.blur(); + } + }, + "click" : function (e) { e.stopImmediatePropagation(); }, + "mousedown" : function (e) { e.stopImmediatePropagation(); }, + "keyup" : function (e) { + h2.width(Math.min(h1.text("pW" + this.value).width(),w)); + }, + "keypress" : function(e) { + if(e.which === 13) { return false; } + } + } + }); + fn = { + fontFamily : a.css('fontFamily') || '', + fontSize : a.css('fontSize') || '', + fontWeight : a.css('fontWeight') || '', + fontStyle : a.css('fontStyle') || '', + fontStretch : a.css('fontStretch') || '', + fontVariant : a.css('fontVariant') || '', + letterSpacing : a.css('letterSpacing') || '', + wordSpacing : a.css('wordSpacing') || '' + }; + s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2); + a.replaceWith(s); + h1.css(fn); + h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(),w))[0].select(); + $(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) { + if (h2 && e.target !== h2) { + $(h2).trigger('blur'); + } + }); + }, + + + /** + * changes the theme + * @name set_theme(theme_name [, theme_url]) + * @param {String} theme_name the name of the new theme to apply + * @param {mixed} theme_url the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory. + * @trigger set_theme.jstree + */ + set_theme : function (theme_name, theme_url) { + if(!theme_name) { return false; } + if(theme_url === true) { + var dir = this.settings.core.themes.dir; + if(!dir) { dir = $.jstree.path + '/themes'; } + theme_url = dir + '/' + theme_name + '/style.css'; + } + if(theme_url && $.inArray(theme_url, themes_loaded) === -1) { + $('head').append('<'+'link rel="stylesheet" href="' + theme_url + '" type="text/css" />'); + themes_loaded.push(theme_url); + } + if(this._data.core.themes.name) { + this.element.removeClass('jstree-' + this._data.core.themes.name); + } + this._data.core.themes.name = theme_name; + this.element.addClass('jstree-' + theme_name); + this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass' ]('jstree-' + theme_name + '-responsive'); + /** + * triggered when a theme is set + * @event + * @name set_theme.jstree + * @param {String} theme the new theme + */ + this.trigger('set_theme', { 'theme' : theme_name }); + }, + /** + * gets the name of the currently applied theme name + * @name get_theme() + * @return {String} + */ + get_theme : function () { return this._data.core.themes.name; }, + /** + * changes the theme variant (if the theme has variants) + * @name set_theme_variant(variant_name) + * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed) + */ + set_theme_variant : function (variant_name) { + if(this._data.core.themes.variant) { + this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); + } + this._data.core.themes.variant = variant_name; + if(variant_name) { + this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); + } + }, + /** + * gets the name of the currently applied theme variant + * @name get_theme() + * @return {String} + */ + get_theme_variant : function () { return this._data.core.themes.variant; }, + /** + * shows a striped background on the container (if the theme supports it) + * @name show_stripes() + */ + show_stripes : function () { + this._data.core.themes.stripes = true; + this.get_container_ul().addClass("jstree-striped"); + /** + * triggered when stripes are shown + * @event + * @name show_stripes.jstree + */ + this.trigger('show_stripes'); + }, + /** + * hides the striped background on the container + * @name hide_stripes() + */ + hide_stripes : function () { + this._data.core.themes.stripes = false; + this.get_container_ul().removeClass("jstree-striped"); + /** + * triggered when stripes are hidden + * @event + * @name hide_stripes.jstree + */ + this.trigger('hide_stripes'); + }, + /** + * toggles the striped background on the container + * @name toggle_stripes() + */ + toggle_stripes : function () { if(this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } }, + /** + * shows the connecting dots (if the theme supports it) + * @name show_dots() + */ + show_dots : function () { + this._data.core.themes.dots = true; + this.get_container_ul().removeClass("jstree-no-dots"); + /** + * triggered when dots are shown + * @event + * @name show_dots.jstree + */ + this.trigger('show_dots'); + }, + /** + * hides the connecting dots + * @name hide_dots() + */ + hide_dots : function () { + this._data.core.themes.dots = false; + this.get_container_ul().addClass("jstree-no-dots"); + /** + * triggered when dots are hidden + * @event + * @name hide_dots.jstree + */ + this.trigger('hide_dots'); + }, + /** + * toggles the connecting dots + * @name toggle_dots() + */ + toggle_dots : function () { if(this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } }, + /** + * show the node icons + * @name show_icons() + */ + show_icons : function () { + this._data.core.themes.icons = true; + this.get_container_ul().removeClass("jstree-no-icons"); + /** + * triggered when icons are shown + * @event + * @name show_icons.jstree + */ + this.trigger('show_icons'); + }, + /** + * hide the node icons + * @name hide_icons() + */ + hide_icons : function () { + this._data.core.themes.icons = false; + this.get_container_ul().addClass("jstree-no-icons"); + /** + * triggered when icons are hidden + * @event + * @name hide_icons.jstree + */ + this.trigger('hide_icons'); + }, + /** + * toggle the node icons + * @name toggle_icons() + */ + toggle_icons : function () { if(this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }, + /** + * show the node ellipsis + * @name show_icons() + */ + show_ellipsis : function () { + this._data.core.themes.ellipsis = true; + this.get_container_ul().addClass("jstree-ellipsis"); + /** + * triggered when ellisis is shown + * @event + * @name show_ellipsis.jstree + */ + this.trigger('show_ellipsis'); + }, + /** + * hide the node ellipsis + * @name hide_ellipsis() + */ + hide_ellipsis : function () { + this._data.core.themes.ellipsis = false; + this.get_container_ul().removeClass("jstree-ellipsis"); + /** + * triggered when ellisis is hidden + * @event + * @name hide_ellipsis.jstree + */ + this.trigger('hide_ellipsis'); + }, + /** + * toggle the node ellipsis + * @name toggle_icons() + */ + toggle_ellipsis : function () { if(this._data.core.themes.ellipsis) { this.hide_ellipsis(); } else { this.show_ellipsis(); } }, + /** + * set the node icon for a node + * @name set_icon(obj, icon) + * @param {mixed} obj + * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class + */ + set_icon : function (obj, icon) { + var t1, t2, dom, old; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.set_icon(obj[t1], icon); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + old = obj.icon; + obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon; + dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon"); + if(icon === false) { + dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel"); + this.hide_icon(obj); + } + else if(icon === true || icon === null || icon === undefined || icon === '') { + dom.removeClass('jstree-themeicon-custom ' + old).css("background","").removeAttr("rel"); + if(old === false) { this.show_icon(obj); } + } + else if(icon.indexOf("/") === -1 && icon.indexOf(".") === -1) { + dom.removeClass(old).css("background",""); + dom.addClass(icon + ' jstree-themeicon-custom').attr("rel",icon); + if(old === false) { this.show_icon(obj); } + } + else { + dom.removeClass(old).css("background",""); + dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel",icon); + if(old === false) { this.show_icon(obj); } + } + return true; + }, + /** + * get the node icon for a node + * @name get_icon(obj) + * @param {mixed} obj + * @return {String} + */ + get_icon : function (obj) { + obj = this.get_node(obj); + return (!obj || obj.id === $.jstree.root) ? false : obj.icon; + }, + /** + * hide the icon on an individual node + * @name hide_icon(obj) + * @param {mixed} obj + */ + hide_icon : function (obj) { + var t1, t2; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.hide_icon(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj === $.jstree.root) { return false; } + obj.icon = false; + this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden'); + return true; + }, + /** + * show the icon on an individual node + * @name show_icon(obj) + * @param {mixed} obj + */ + show_icon : function (obj) { + var t1, t2, dom; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.show_icon(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj === $.jstree.root) { return false; } + dom = this.get_node(obj, true); + obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true; + if(!obj.icon) { obj.icon = true; } + dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden'); + return true; + } + }; + + // helpers + $.vakata = {}; + // collect attributes + $.vakata.attributes = function(node, with_values) { + node = $(node)[0]; + var attr = with_values ? {} : []; + if(node && node.attributes) { + $.each(node.attributes, function (i, v) { + if($.inArray(v.name.toLowerCase(),['style','contenteditable','hasfocus','tabindex']) !== -1) { return; } + if(v.value !== null && $.vakata.trim(v.value) !== '') { + if(with_values) { attr[v.name] = v.value; } + else { attr.push(v.name); } + } + }); + } + return attr; + }; + $.vakata.array_unique = function(array) { + var a = [], i, j, l, o = {}; + for(i = 0, l = array.length; i < l; i++) { + if(o[array[i]] === undefined) { + a.push(array[i]); + o[array[i]] = true; + } + } + return a; + }; + // remove item from array + $.vakata.array_remove = function(array, from) { + array.splice(from, 1); + return array; + //var rest = array.slice((to || from) + 1 || array.length); + //array.length = from < 0 ? array.length + from : from; + //array.push.apply(array, rest); + //return array; + }; + // remove item from array + $.vakata.array_remove_item = function(array, item) { + var tmp = $.inArray(item, array); + return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array; + }; + $.vakata.array_filter = function(c,a,b,d,e) { + if (c.filter) { + return c.filter(a, b); + } + d=[]; + for (e in c) { + if (~~e+''===e+'' && e>=0 && a.call(b,c[e],+e,c)) { + d.push(c[e]); + } + } + return d; + }; + $.vakata.trim = function (text) { + return String.prototype.trim ? + String.prototype.trim.call(text.toString()) : + text.toString().replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + }; + $.vakata.is_function = function(obj) { + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + $.vakata.is_array = Array.isArray || function (obj) { + return Object.prototype.toString.call(obj) === "[object Array]"; + }; + + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind#polyfill + if (!Function.prototype.bind) { + Function.prototype.bind = function () { + var thatFunc = this, thatArg = arguments[0]; + var args = Array.prototype.slice.call(arguments, 1); + if (typeof thatFunc !== 'function') { + // closest thing possible to the ECMAScript 5 + // internal IsCallable function + throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); + } + return function(){ + var funcArgs = args.concat(Array.prototype.slice.call(arguments)); + return thatFunc.apply(thatArg, funcArgs); + }; + }; + } + + +/** + * ### Changed plugin + * + * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes. + */ + + $.jstree.plugins.changed = function (options, parent) { + var last = []; + this.trigger = function (ev, data) { + var i, j; + if(!data) { + data = {}; + } + if(ev.replace('.jstree','') === 'changed') { + data.changed = { selected : [], deselected : [] }; + var tmp = {}; + for(i = 0, j = last.length; i < j; i++) { + tmp[last[i]] = 1; + } + for(i = 0, j = data.selected.length; i < j; i++) { + if(!tmp[data.selected[i]]) { + data.changed.selected.push(data.selected[i]); + } + else { + tmp[data.selected[i]] = 2; + } + } + for(i = 0, j = last.length; i < j; i++) { + if(tmp[last[i]] === 1) { + data.changed.deselected.push(last[i]); + } + } + last = data.selected.slice(); + } + /** + * triggered when selection changes (the "changed" plugin enhances the original event with more data) + * @event + * @name changed.jstree + * @param {Object} node + * @param {Object} action the action that caused the selection to change + * @param {Array} selected the current selection + * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event + * @param {Object} event the event (if any) that triggered this changed event + * @plugin changed + */ + parent.trigger.call(this, ev, data); + }; + this.refresh = function (skip_loading, forget_state) { + last = []; + return parent.refresh.apply(this, arguments); + }; + }; + +/** + * ### Checkbox plugin + * + * This plugin renders checkbox icons in front of each node, making multiple selection much easier. + * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up. + */ + + var _i = document.createElement('I'); + _i.className = 'jstree-icon jstree-checkbox'; + _i.setAttribute('role', 'presentation'); + /** + * stores all defaults for the checkbox plugin + * @name $.jstree.defaults.checkbox + * @plugin checkbox + */ + $.jstree.defaults.checkbox = { + /** + * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`. + * @name $.jstree.defaults.checkbox.visible + * @plugin checkbox + */ + visible : true, + /** + * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`. + * @name $.jstree.defaults.checkbox.three_state + * @plugin checkbox + */ + three_state : true, + /** + * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`. + * @name $.jstree.defaults.checkbox.whole_node + * @plugin checkbox + */ + whole_node : true, + /** + * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`. + * @name $.jstree.defaults.checkbox.keep_selected_style + * @plugin checkbox + */ + keep_selected_style : true, + /** + * This setting controls how cascading and undetermined nodes are applied. + * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used. + * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''. + * @name $.jstree.defaults.checkbox.cascade + * @plugin checkbox + */ + cascade : '', + /** + * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing. + * @name $.jstree.defaults.checkbox.tie_selection + * @plugin checkbox + */ + tie_selection : true, + + /** + * This setting controls if cascading down affects disabled checkboxes + * @name $.jstree.defaults.checkbox.cascade_to_disabled + * @plugin checkbox + */ + cascade_to_disabled : true, + + /** + * This setting controls if cascading down affects hidden checkboxes + * @name $.jstree.defaults.checkbox.cascade_to_hidden + * @plugin checkbox + */ + cascade_to_hidden : true + }; + $.jstree.plugins.checkbox = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + this._data.checkbox.uto = false; + this._data.checkbox.selected = []; + if(this.settings.checkbox.three_state) { + this.settings.checkbox.cascade = 'up+down+undetermined'; + } + this.element + .on("init.jstree", function () { + this._data.checkbox.visible = this.settings.checkbox.visible; + if(!this.settings.checkbox.keep_selected_style) { + this.element.addClass('jstree-checkbox-no-clicked'); + } + if(this.settings.checkbox.tie_selection) { + this.element.addClass('jstree-checkbox-selection'); + } + }.bind(this)) + .on("loading.jstree", function () { + this[ this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes' ](); + }.bind(this)); + if(this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { + this.element + .on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', function () { + // only if undetermined is in setting + if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } + this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50); + }.bind(this)); + } + if(!this.settings.checkbox.tie_selection) { + this.element + .on('model.jstree', function (e, data) { + var m = this._model.data, + p = m[data.parent], + dpc = data.nodes, + i, j; + for(i = 0, j = dpc.length; i < j; i++) { + m[dpc[i]].state.checked = m[dpc[i]].state.checked || (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked); + if(m[dpc[i]].state.checked) { + this._data.checkbox.selected.push(dpc[i]); + } + } + }.bind(this)); + } + if(this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) { + this.element + .on('model.jstree', function (e, data) { + var m = this._model.data, + p = m[data.parent], + dpc = data.nodes, + chd = [], + c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection; + + if(s.indexOf('down') !== -1) { + // apply down + if(p.state[ t ? 'selected' : 'checked' ]) { + for(i = 0, j = dpc.length; i < j; i++) { + m[dpc[i]].state[ t ? 'selected' : 'checked' ] = true; + } + + this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(dpc); + } + else { + for(i = 0, j = dpc.length; i < j; i++) { + if(m[dpc[i]].state[ t ? 'selected' : 'checked' ]) { + for(k = 0, l = m[dpc[i]].children_d.length; k < l; k++) { + m[m[dpc[i]].children_d[k]].state[ t ? 'selected' : 'checked' ] = true; + } + this._data[ t ? 'core' : 'checkbox' ].selected = this._data[ t ? 'core' : 'checkbox' ].selected.concat(m[dpc[i]].children_d); + } + } + } + } + + if(s.indexOf('up') !== -1) { + // apply up + for(i = 0, j = p.children_d.length; i < j; i++) { + if(!m[p.children_d[i]].children.length) { + chd.push(m[p.children_d[i]].parent); + } + } + chd = $.vakata.array_unique(chd); + for(k = 0, l = chd.length; k < l; k++) { + p = m[chd[k]]; + while(p && p.id !== $.jstree.root) { + c = 0; + for(i = 0, j = p.children.length; i < j; i++) { + c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; + } + if(c === j) { + p.state[ t ? 'selected' : 'checked' ] = true; + this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); + tmp = this.get_node(p, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', true).addClass( t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + break; + } + p = this.get_node(p.parent); + } + } + } + + this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected); + }.bind(this)) + .on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', function (e, data) { + var self = this, + obj = data.node, + m = this._model.data, + par = this.get_node(obj.parent), + i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, + sel = {}, cur = this._data[ t ? 'core' : 'checkbox' ].selected; + + for (i = 0, j = cur.length; i < j; i++) { + sel[cur[i]] = true; + } + + // apply down + if(s.indexOf('down') !== -1) { + //this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d)); + var selectedIds = this._cascade_new_checked_state(obj.id, true); + var temp = obj.children_d.concat(obj.id); + for (i = 0, j = temp.length; i < j; i++) { + if (selectedIds.indexOf(temp[i]) > -1) { + sel[temp[i]] = true; + } + else { + delete sel[temp[i]]; + } + } + } + + // apply up + if(s.indexOf('up') !== -1) { + while(par && par.id !== $.jstree.root) { + c = 0; + for(i = 0, j = par.children.length; i < j; i++) { + c += m[par.children[i]].state[ t ? 'selected' : 'checked' ]; + } + if(c === j) { + par.state[ t ? 'selected' : 'checked' ] = true; + sel[par.id] = true; + //this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id); + tmp = this.get_node(par, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + break; + } + par = this.get_node(par.parent); + } + } + + cur = []; + for (i in sel) { + if (sel.hasOwnProperty(i)) { + cur.push(i); + } + } + this._data[ t ? 'core' : 'checkbox' ].selected = cur; + }.bind(this)) + .on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', function (e, data) { + var obj = this.get_node($.jstree.root), + m = this._model.data, + i, j, tmp; + for(i = 0, j = obj.children_d.length; i < j; i++) { + tmp = m[obj.children_d[i]]; + if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { + tmp.original.state.undetermined = false; + } + } + }.bind(this)) + .on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', function (e, data) { + var self = this, + obj = data.node, + dom = this.get_node(obj, true), + i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, + cur = this._data[ t ? 'core' : 'checkbox' ].selected, sel = {}, + stillSelectedIds = [], + allIds = obj.children_d.concat(obj.id); + + // apply down + if(s.indexOf('down') !== -1) { + var selectedIds = this._cascade_new_checked_state(obj.id, false); + + cur = $.vakata.array_filter(cur, function(id) { + return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1; + }); + } + + // only apply up if cascade up is enabled and if this node is not selected + // (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected). + if(s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) { + for(i = 0, j = obj.parents.length; i < j; i++) { + tmp = this._model.data[obj.parents[i]]; + tmp.state[ t ? 'selected' : 'checked' ] = false; + if(tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { + tmp.original.state.undetermined = false; + } + tmp = this.get_node(obj.parents[i], true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + + cur = $.vakata.array_filter(cur, function(id) { + return obj.parents.indexOf(id) === -1; + }); + } + + this._data[ t ? 'core' : 'checkbox' ].selected = cur; + }.bind(this)); + } + if(this.settings.checkbox.cascade.indexOf('up') !== -1) { + this.element + .on('delete_node.jstree', function (e, data) { + // apply up (whole handler) + var p = this.get_node(data.parent), + m = this._model.data, + i, j, c, tmp, t = this.settings.checkbox.tie_selection; + while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) { + c = 0; + for(i = 0, j = p.children.length; i < j; i++) { + c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; + } + if(j > 0 && c === j) { + p.state[ t ? 'selected' : 'checked' ] = true; + this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); + tmp = this.get_node(p, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + break; + } + p = this.get_node(p.parent); + } + }.bind(this)) + .on('move_node.jstree', function (e, data) { + // apply up (whole handler) + var is_multi = data.is_multi, + old_par = data.old_parent, + new_par = this.get_node(data.parent), + m = this._model.data, + p, c, i, j, tmp, t = this.settings.checkbox.tie_selection; + if(!is_multi) { + p = this.get_node(old_par); + while(p && p.id !== $.jstree.root && !p.state[ t ? 'selected' : 'checked' ]) { + c = 0; + for(i = 0, j = p.children.length; i < j; i++) { + c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; + } + if(j > 0 && c === j) { + p.state[ t ? 'selected' : 'checked' ] = true; + this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); + tmp = this.get_node(p, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + break; + } + p = this.get_node(p.parent); + } + } + p = new_par; + while(p && p.id !== $.jstree.root) { + c = 0; + for(i = 0, j = p.children.length; i < j; i++) { + c += m[p.children[i]].state[ t ? 'selected' : 'checked' ]; + } + if(c === j) { + if(!p.state[ t ? 'selected' : 'checked' ]) { + p.state[ t ? 'selected' : 'checked' ] = true; + this._data[ t ? 'core' : 'checkbox' ].selected.push(p.id); + tmp = this.get_node(p, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + } + else { + if(p.state[ t ? 'selected' : 'checked' ]) { + p.state[ t ? 'selected' : 'checked' ] = false; + this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_remove_item(this._data[ t ? 'core' : 'checkbox' ].selected, p.id); + tmp = this.get_node(p, true); + if(tmp && tmp.length) { + tmp.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + break; + } + } + p = this.get_node(p.parent); + } + }.bind(this)); + } + }; + /** + * get an array of all nodes whose state is "undetermined" + * @name get_undetermined([full]) + * @param {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + * @plugin checkbox + */ + this.get_undetermined = function (full) { + if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) { + return []; + } + var i, j, k, l, o = {}, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[ t ? 'core' : 'checkbox' ].selected, p = [], tt = this, r = []; + for(i = 0, j = s.length; i < j; i++) { + if(m[s[i]] && m[s[i]].parents) { + for(k = 0, l = m[s[i]].parents.length; k < l; k++) { + if(o[m[s[i]].parents[k]] !== undefined) { + break; + } + if(m[s[i]].parents[k] !== $.jstree.root) { + o[m[s[i]].parents[k]] = true; + p.push(m[s[i]].parents[k]); + } + } + } + } + // attempt for server side undetermined state + this.element.find('.jstree-closed').not(':has(.jstree-children)') + .each(function () { + var tmp = tt.get_node(this), tmp2; + + if(!tmp) { return; } + + if(!tmp.state.loaded) { + if(tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) { + if(o[tmp.id] === undefined && tmp.id !== $.jstree.root) { + o[tmp.id] = true; + p.push(tmp.id); + } + for(k = 0, l = tmp.parents.length; k < l; k++) { + if(o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) { + o[tmp.parents[k]] = true; + p.push(tmp.parents[k]); + } + } + } + } + else { + for(i = 0, j = tmp.children_d.length; i < j; i++) { + tmp2 = m[tmp.children_d[i]]; + if(!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) { + if(o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) { + o[tmp2.id] = true; + p.push(tmp2.id); + } + for(k = 0, l = tmp2.parents.length; k < l; k++) { + if(o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) { + o[tmp2.parents[k]] = true; + p.push(tmp2.parents[k]); + } + } + } + } + } + }); + for (i = 0, j = p.length; i < j; i++) { + if(!m[p[i]].state[ t ? 'selected' : 'checked' ]) { + r.push(full ? m[p[i]] : p[i]); + } + } + return r; + }; + /** + * set the undetermined state where and if necessary. Used internally. + * @private + * @name _undetermined() + * @plugin checkbox + */ + this._undetermined = function () { + if(this.element === null) { return; } + var p = this.get_undetermined(false), i, j, s; + + this.element.find('.jstree-undetermined').removeClass('jstree-undetermined'); + for (i = 0, j = p.length; i < j; i++) { + s = this.get_node(p[i], true); + if(s && s.length) { + s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined'); + } + } + }; + this.redraw_node = function(obj, deep, is_callback, force_render) { + obj = parent.redraw_node.apply(this, arguments); + if(obj) { + var i, j, tmp = null, icon = null; + for(i = 0, j = obj.childNodes.length; i < j; i++) { + if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { + tmp = obj.childNodes[i]; + break; + } + } + if(tmp) { + if(!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; } + icon = _i.cloneNode(false); + if(this._model.data[obj.id].state.checkbox_disabled) { icon.className += ' jstree-checkbox-disabled'; } + tmp.insertBefore(icon, tmp.childNodes[0]); + } + } + if(!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { + if(this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } + this._data.checkbox.uto = setTimeout(this._undetermined.bind(this), 50); + } + return obj; + }; + /** + * show the node checkbox icons + * @name show_checkboxes() + * @plugin checkbox + */ + this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); }; + /** + * hide the node checkbox icons + * @name hide_checkboxes() + * @plugin checkbox + */ + this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); }; + /** + * toggle the node icons + * @name toggle_checkboxes() + * @plugin checkbox + */ + this.toggle_checkboxes = function () { if(this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } }; + /** + * checks if a node is in an undetermined state + * @name is_undetermined(obj) + * @param {mixed} obj + * @return {Boolean} + */ + this.is_undetermined = function (obj) { + obj = this.get_node(obj); + var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[ t ? 'core' : 'checkbox' ].selected, m = this._model.data; + if(!obj || obj.state[ t ? 'selected' : 'checked' ] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) { + return false; + } + if(!obj.state.loaded && obj.original.state.undetermined === true) { + return true; + } + for(i = 0, j = obj.children_d.length; i < j; i++) { + if($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) { + return true; + } + } + return false; + }; + /** + * disable a node's checkbox + * @name disable_checkbox(obj) + * @param {mixed} obj an array can be used too + * @trigger disable_checkbox.jstree + * @plugin checkbox + */ + this.disable_checkbox = function (obj) { + var t1, t2, dom; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.disable_checkbox(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(!obj.state.checkbox_disabled) { + obj.state.checkbox_disabled = true; + if(dom && dom.length) { + dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled'); + } + /** + * triggered when an node's checkbox is disabled + * @event + * @name disable_checkbox.jstree + * @param {Object} node + * @plugin checkbox + */ + this.trigger('disable_checkbox', { 'node' : obj }); + } + }; + /** + * enable a node's checkbox + * @name enable_checkbox(obj) + * @param {mixed} obj an array can be used too + * @trigger enable_checkbox.jstree + * @plugin checkbox + */ + this.enable_checkbox = function (obj) { + var t1, t2, dom; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.enable_checkbox(obj[t1]); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(obj.state.checkbox_disabled) { + obj.state.checkbox_disabled = false; + if(dom && dom.length) { + dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled'); + } + /** + * triggered when an node's checkbox is enabled + * @event + * @name enable_checkbox.jstree + * @param {Object} node + * @plugin checkbox + */ + this.trigger('enable_checkbox', { 'node' : obj }); + } + }; + + this.activate_node = function (obj, e) { + if($(e.target).hasClass('jstree-checkbox-disabled')) { + return false; + } + if(this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) { + e.ctrlKey = true; + } + if(this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) { + return parent.activate_node.call(this, obj, e); + } + if(this.is_disabled(obj)) { + return false; + } + if(this.is_checked(obj)) { + this.uncheck_node(obj, e); + } + else { + this.check_node(obj, e); + } + this.trigger('activate_node', { 'node' : this.get_node(obj) }); + }; + this.delete_node = function (obj) { + if(this.settings.checkbox.tie_selection || $.vakata.is_array(obj)) { + return parent.delete_node.call(this, obj); + } + var tmp, k, l, c = false; + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + tmp = obj.children_d.concat([]); + tmp.push(obj.id); + for(k = 0, l = tmp.length; k < l; k++) { + if(this._model.data[tmp[k]].state.checked) { + c = true; + break; + } + } + if (c) { + this._data.checkbox.selected = $.vakata.array_filter(this._data.checkbox.selected, function (v) { + return $.inArray(v, tmp) === -1; + }); + } + return parent.delete_node.call(this, obj); + }; + + /** + * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants). + * However if these unaffected nodes are already selected their ids will be included in the returned array. + * @private + * @name _cascade_new_checked_state(id, checkedState) + * @param {string} id the node ID + * @param {bool} checkedState should the nodes be checked or not + * @returns {Array} Array of all node id's (in this tree branch) that are checked. + */ + this._cascade_new_checked_state = function (id, checkedState) { + var self = this; + var t = this.settings.checkbox.tie_selection; + var node = this._model.data[id]; + var selectedNodeIds = []; + var selectedChildrenIds = [], i, j, selectedChildIds; + + if ( + (this.settings.checkbox.cascade_to_disabled || !node.state.disabled) && + (this.settings.checkbox.cascade_to_hidden || !node.state.hidden) + ) { + //First try and check/uncheck the children + if (node.children) { + for (i = 0, j = node.children.length; i < j; i++) { + var childId = node.children[i]; + selectedChildIds = self._cascade_new_checked_state(childId, checkedState); + selectedNodeIds = selectedNodeIds.concat(selectedChildIds); + if (selectedChildIds.indexOf(childId) > -1) { + selectedChildrenIds.push(childId); + } + } + } + + var dom = self.get_node(node, true); + + //A node's state is undetermined if some but not all of it's children are checked/selected . + var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length; + + if(node.original && node.original.state && node.original.state.undetermined) { + node.original.state.undetermined = undetermined; + } + + //If a node is undetermined then remove selected class + if (undetermined) { + node.state[ t ? 'selected' : 'checked' ] = false; + dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + //Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children), + //check the node and style it correctly. + else if (checkedState && selectedChildrenIds.length === node.children.length) { + node.state[ t ? 'selected' : 'checked' ] = checkedState; + selectedNodeIds.push(node.id); + + dom.children('.jstree-anchor').attr('aria-selected', true).addClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + else { + node.state[ t ? 'selected' : 'checked' ] = false; + dom.children('.jstree-anchor').attr('aria-selected', false).removeClass(t ? 'jstree-clicked' : 'jstree-checked'); + } + } + else { + selectedChildIds = this.get_checked_descendants(id); + + if (node.state[ t ? 'selected' : 'checked' ]) { + selectedChildIds.push(node.id); + } + + selectedNodeIds = selectedNodeIds.concat(selectedChildIds); + } + + return selectedNodeIds; + }; + + /** + * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id) + * @name get_checked_descendants(obj) + * @param {string} id the node ID + * @return {Array} array of IDs + * @plugin checkbox + */ + this.get_checked_descendants = function (id) { + var self = this; + var t = self.settings.checkbox.tie_selection; + var node = self._model.data[id]; + + return $.vakata.array_filter(node.children_d, function(_id) { + return self._model.data[_id].state[ t ? 'selected' : 'checked' ]; + }); + }; + + /** + * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally) + * @name check_node(obj) + * @param {mixed} obj an array can be used to check multiple nodes + * @trigger check_node.jstree + * @plugin checkbox + */ + this.check_node = function (obj, e) { + if(this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); } + var dom, t1, t2, th; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.check_node(obj[t1], e); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(!obj.state.checked) { + obj.state.checked = true; + this._data.checkbox.selected.push(obj.id); + if(dom && dom.length) { + dom.children('.jstree-anchor').addClass('jstree-checked'); + } + /** + * triggered when an node is checked (only if tie_selection in checkbox settings is false) + * @event + * @name check_node.jstree + * @param {Object} node + * @param {Array} selected the current selection + * @param {Object} event the event (if any) that triggered this check_node + * @plugin checkbox + */ + this.trigger('check_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e }); + } + }; + /** + * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally) + * @name uncheck_node(obj) + * @param {mixed} obj an array can be used to uncheck multiple nodes + * @trigger uncheck_node.jstree + * @plugin checkbox + */ + this.uncheck_node = function (obj, e) { + if(this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); } + var t1, t2, dom; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.uncheck_node(obj[t1], e); + } + return true; + } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { + return false; + } + dom = this.get_node(obj, true); + if(obj.state.checked) { + obj.state.checked = false; + this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id); + if(dom.length) { + dom.children('.jstree-anchor').removeClass('jstree-checked'); + } + /** + * triggered when an node is unchecked (only if tie_selection in checkbox settings is false) + * @event + * @name uncheck_node.jstree + * @param {Object} node + * @param {Array} selected the current selection + * @param {Object} event the event (if any) that triggered this uncheck_node + * @plugin checkbox + */ + this.trigger('uncheck_node', { 'node' : obj, 'selected' : this._data.checkbox.selected, 'event' : e }); + } + }; + + /** + * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally) + * @name check_all() + * @trigger check_all.jstree, changed.jstree + * @plugin checkbox + */ + this.check_all = function () { + if(this.settings.checkbox.tie_selection) { return this.select_all(); } + var tmp = this._data.checkbox.selected.concat([]), i, j; + this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat(); + for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) { + if(this._model.data[this._data.checkbox.selected[i]]) { + this._model.data[this._data.checkbox.selected[i]].state.checked = true; + } + } + this.redraw(true); + /** + * triggered when all nodes are checked (only if tie_selection in checkbox settings is false) + * @event + * @name check_all.jstree + * @param {Array} selected the current selection + * @plugin checkbox + */ + this.trigger('check_all', { 'selected' : this._data.checkbox.selected }); + }; + /** + * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally) + * @name uncheck_all() + * @trigger uncheck_all.jstree + * @plugin checkbox + */ + this.uncheck_all = function () { + if(this.settings.checkbox.tie_selection) { return this.deselect_all(); } + var tmp = this._data.checkbox.selected.concat([]), i, j; + for(i = 0, j = this._data.checkbox.selected.length; i < j; i++) { + if(this._model.data[this._data.checkbox.selected[i]]) { + this._model.data[this._data.checkbox.selected[i]].state.checked = false; + } + } + this._data.checkbox.selected = []; + this.element.find('.jstree-checked').removeClass('jstree-checked'); + /** + * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false) + * @event + * @name uncheck_all.jstree + * @param {Object} node the previous selection + * @param {Array} selected the current selection + * @plugin checkbox + */ + this.trigger('uncheck_all', { 'selected' : this._data.checkbox.selected, 'node' : tmp }); + }; + /** + * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected) + * @name is_checked(obj) + * @param {mixed} obj + * @return {Boolean} + * @plugin checkbox + */ + this.is_checked = function (obj) { + if(this.settings.checkbox.tie_selection) { return this.is_selected(obj); } + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + return obj.state.checked; + }; + /** + * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected) + * @name get_checked([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + * @plugin checkbox + */ + this.get_checked = function (full) { + if(this.settings.checkbox.tie_selection) { return this.get_selected(full); } + return full ? $.map(this._data.checkbox.selected, function (i) { return this.get_node(i); }.bind(this)) : this._data.checkbox.selected.slice(); + }; + /** + * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected) + * @name get_top_checked([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + * @plugin checkbox + */ + this.get_top_checked = function (full) { + if(this.settings.checkbox.tie_selection) { return this.get_top_selected(full); } + var tmp = this.get_checked(true), + obj = {}, i, j, k, l; + for(i = 0, j = tmp.length; i < j; i++) { + obj[tmp[i].id] = tmp[i]; + } + for(i = 0, j = tmp.length; i < j; i++) { + for(k = 0, l = tmp[i].children_d.length; k < l; k++) { + if(obj[tmp[i].children_d[k]]) { + delete obj[tmp[i].children_d[k]]; + } + } + } + tmp = []; + for(i in obj) { + if(obj.hasOwnProperty(i)) { + tmp.push(i); + } + } + return full ? $.map(tmp, function (i) { return this.get_node(i); }.bind(this)) : tmp; + }; + /** + * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected) + * @name get_bottom_checked([full]) + * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned + * @return {Array} + * @plugin checkbox + */ + this.get_bottom_checked = function (full) { + if(this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); } + var tmp = this.get_checked(true), + obj = [], i, j; + for(i = 0, j = tmp.length; i < j; i++) { + if(!tmp[i].children.length) { + obj.push(tmp[i].id); + } + } + return full ? $.map(obj, function (i) { return this.get_node(i); }.bind(this)) : obj; + }; + this.load_node = function (obj, callback) { + var k, l, i, j, c, tmp; + if(!$.vakata.is_array(obj) && !this.settings.checkbox.tie_selection) { + tmp = this.get_node(obj); + if(tmp && tmp.state.loaded) { + for(k = 0, l = tmp.children_d.length; k < l; k++) { + if(this._model.data[tmp.children_d[k]].state.checked) { + c = true; + this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]); + } + } + } + } + return parent.load_node.apply(this, arguments); + }; + this.get_state = function () { + var state = parent.get_state.apply(this, arguments); + if(this.settings.checkbox.tie_selection) { return state; } + state.checkbox = this._data.checkbox.selected.slice(); + return state; + }; + this.set_state = function (state, callback) { + var res = parent.set_state.apply(this, arguments); + if(res && state.checkbox) { + if(!this.settings.checkbox.tie_selection) { + this.uncheck_all(); + var _this = this; + $.each(state.checkbox, function (i, v) { + _this.check_node(v); + }); + } + delete state.checkbox; + this.set_state(state, callback); + return false; + } + return res; + }; + this.refresh = function (skip_loading, forget_state) { + if(this.settings.checkbox.tie_selection) { + this._data.checkbox.selected = []; + } + return parent.refresh.apply(this, arguments); + }; + }; + + // include the checkbox plugin by default + // $.jstree.defaults.plugins.push("checkbox"); + + +/** + * ### Conditionalselect plugin + * + * This plugin allows defining a callback to allow or deny node selection by user input (activate node method). + */ + + /** + * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`. + * @name $.jstree.defaults.checkbox.visible + * @plugin checkbox + */ + $.jstree.defaults.conditionalselect = function () { return true; }; + $.jstree.plugins.conditionalselect = function (options, parent) { + // own function + this.activate_node = function (obj, e) { + if(this.settings.conditionalselect.call(this, this.get_node(obj), e)) { + return parent.activate_node.call(this, obj, e); + } + }; + }; + + +/** + * ### Contextmenu plugin + * + * Shows a context menu when a node is right-clicked. + */ + + /** + * stores all defaults for the contextmenu plugin + * @name $.jstree.defaults.contextmenu + * @plugin contextmenu + */ + $.jstree.defaults.contextmenu = { + /** + * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`. + * @name $.jstree.defaults.contextmenu.select_node + * @plugin contextmenu + */ + select_node : true, + /** + * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used. + * @name $.jstree.defaults.contextmenu.show_at_node + * @plugin contextmenu + */ + show_at_node : true, + /** + * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too). + * + * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu. + * + * * `separator_before` - a boolean indicating if there should be a separator before this item + * * `separator_after` - a boolean indicating if there should be a separator after this item + * * `_disabled` - a boolean indicating if this action should be disabled + * * `label` - a string - the name of the action (could be a function returning a string) + * * `title` - a string - an optional tooltip for the item + * * `action` - a function to be executed if this item is chosen, the function will receive + * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class + * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2) + * * `shortcut_label` - shortcut label (like for example `F2` for rename) + * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered + * + * @name $.jstree.defaults.contextmenu.items + * @plugin contextmenu + */ + items : function (o, cb) { // Could be an object directly + return { + "create" : { + "separator_before" : false, + "separator_after" : true, + "_disabled" : false, //(this.check("create_node", data.reference, {}, "last")), + "label" : "Create", + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + inst.create_node(obj, {}, "last", function (new_node) { + try { + inst.edit(new_node); + } catch (ex) { + setTimeout(function () { inst.edit(new_node); },0); + } + }); + } + }, + "rename" : { + "separator_before" : false, + "separator_after" : false, + "_disabled" : false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")), + "label" : "Rename", + /*! + "shortcut" : 113, + "shortcut_label" : 'F2', + "icon" : "glyphicon glyphicon-leaf", + */ + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + inst.edit(obj); + } + }, + "remove" : { + "separator_before" : false, + "icon" : false, + "separator_after" : false, + "_disabled" : false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")), + "label" : "Delete", + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + if(inst.is_selected(obj)) { + inst.delete_node(inst.get_selected()); + } + else { + inst.delete_node(obj); + } + } + }, + "ccp" : { + "separator_before" : true, + "icon" : false, + "separator_after" : false, + "label" : "Edit", + "action" : false, + "submenu" : { + "cut" : { + "separator_before" : false, + "separator_after" : false, + "label" : "Cut", + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + if(inst.is_selected(obj)) { + inst.cut(inst.get_top_selected()); + } + else { + inst.cut(obj); + } + } + }, + "copy" : { + "separator_before" : false, + "icon" : false, + "separator_after" : false, + "label" : "Copy", + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + if(inst.is_selected(obj)) { + inst.copy(inst.get_top_selected()); + } + else { + inst.copy(obj); + } + } + }, + "paste" : { + "separator_before" : false, + "icon" : false, + "_disabled" : function (data) { + return !$.jstree.reference(data.reference).can_paste(); + }, + "separator_after" : false, + "label" : "Paste", + "action" : function (data) { + var inst = $.jstree.reference(data.reference), + obj = inst.get_node(data.reference); + inst.paste(obj); + } + } + } + } + }; + } + }; + + $.jstree.plugins.contextmenu = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + + var last_ts = 0, cto = null, ex, ey; + this.element + .on("init.jstree loading.jstree ready.jstree", function () { + this.get_container_ul().addClass('jstree-contextmenu'); + }.bind(this)) + .on("contextmenu.jstree", ".jstree-anchor", function (e, data) { + if (e.target.tagName.toLowerCase() === 'input') { + return; + } + e.preventDefault(); + last_ts = e.ctrlKey ? +new Date() : 0; + if(data || cto) { + last_ts = (+new Date()) + 10000; + } + if(cto) { + clearTimeout(cto); + } + if(!this.is_loading(e.currentTarget)) { + this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e); + } + }.bind(this)) + .on("click.jstree", ".jstree-anchor", function (e) { + if(this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click + $.vakata.context.hide(); + } + last_ts = 0; + }.bind(this)) + .on("touchstart.jstree", ".jstree-anchor", function (e) { + if(!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) { + return; + } + ex = e.originalEvent.changedTouches[0].clientX; + ey = e.originalEvent.changedTouches[0].clientY; + cto = setTimeout(function () { + $(e.currentTarget).trigger('contextmenu', true); + }, 750); + }) + .on('touchmove.vakata.jstree', function (e) { + if(cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) { + clearTimeout(cto); + $.vakata.context.hide(); + } + }) + .on('touchend.vakata.jstree', function (e) { + if(cto) { + clearTimeout(cto); + } + }); + + /*! + if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) { + var el = null, tm = null; + this.element + .on("touchstart", ".jstree-anchor", function (e) { + el = e.currentTarget; + tm = +new Date(); + $(document).one("touchend", function (e) { + e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset); + e.currentTarget = e.target; + tm = ((+(new Date())) - tm); + if(e.target === el && tm > 600 && tm < 1000) { + e.preventDefault(); + $(el).trigger('contextmenu', e); + } + el = null; + tm = null; + }); + }); + } + */ + $(document).on("context_hide.vakata.jstree", function (e, data) { + this._data.contextmenu.visible = false; + $(data.reference).removeClass('jstree-context'); + }.bind(this)); + }; + this.teardown = function () { + if(this._data.contextmenu.visible) { + $.vakata.context.hide(); + } + $(document).off("context_hide.vakata.jstree"); + parent.teardown.call(this); + }; + + /** + * prepare and show the context menu for a node + * @name show_contextmenu(obj [, x, y]) + * @param {mixed} obj the node + * @param {Number} x the x-coordinate relative to the document to show the menu at + * @param {Number} y the y-coordinate relative to the document to show the menu at + * @param {Object} e the event if available that triggered the contextmenu + * @plugin contextmenu + * @trigger show_contextmenu.jstree + */ + this.show_contextmenu = function (obj, x, y, e) { + obj = this.get_node(obj); + if(!obj || obj.id === $.jstree.root) { return false; } + var s = this.settings.contextmenu, + d = this.get_node(obj, true), + a = d.children(".jstree-anchor"), + o = false, + i = false; + if(s.show_at_node || x === undefined || y === undefined) { + o = a.offset(); + x = o.left; + y = o.top + this._data.core.li_height; + } + if(this.settings.contextmenu.select_node && !this.is_selected(obj)) { + this.activate_node(obj, e); + } + + i = s.items; + if($.vakata.is_function(i)) { + i = i.call(this, obj, function (i) { + this._show_contextmenu(obj, x, y, i); + }.bind(this)); + } + if($.isPlainObject(i)) { + this._show_contextmenu(obj, x, y, i); + } + }; + /** + * show the prepared context menu for a node + * @name _show_contextmenu(obj, x, y, i) + * @param {mixed} obj the node + * @param {Number} x the x-coordinate relative to the document to show the menu at + * @param {Number} y the y-coordinate relative to the document to show the menu at + * @param {Number} i the object of items to show + * @plugin contextmenu + * @trigger show_contextmenu.jstree + * @private + */ + this._show_contextmenu = function (obj, x, y, i) { + var d = this.get_node(obj, true), + a = d.children(".jstree-anchor"); + $(document).one("context_show.vakata.jstree", function (e, data) { + var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu'; + $(data.element).addClass(cls); + a.addClass('jstree-context'); + }.bind(this)); + this._data.contextmenu.visible = true; + $.vakata.context.show(a, { 'x' : x, 'y' : y }, i); + /** + * triggered when the contextmenu is shown for a node + * @event + * @name show_contextmenu.jstree + * @param {Object} node the node + * @param {Number} x the x-coordinate of the menu relative to the document + * @param {Number} y the y-coordinate of the menu relative to the document + * @plugin contextmenu + */ + this.trigger('show_contextmenu', { "node" : obj, "x" : x, "y" : y }); + }; + }; + + // contextmenu helper + (function ($) { + var right_to_left = false, + vakata_context = { + element : false, + reference : false, + position_x : 0, + position_y : 0, + items : [], + html : "", + is_visible : false + }; + + $.vakata.context = { + settings : { + hide_onmouseleave : 0, + icons : true + }, + _trigger : function (event_name) { + $(document).triggerHandler("context_" + event_name + ".vakata", { + "reference" : vakata_context.reference, + "element" : vakata_context.element, + "position" : { + "x" : vakata_context.position_x, + "y" : vakata_context.position_y + } + }); + }, + _execute : function (i) { + i = vakata_context.items[i]; + return i && (!i._disabled || ($.vakata.is_function(i._disabled) && !i._disabled({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }))) && i.action ? i.action.call(null, { + "item" : i, + "reference" : vakata_context.reference, + "element" : vakata_context.element, + "position" : { + "x" : vakata_context.position_x, + "y" : vakata_context.position_y + } + }) : false; + }, + _parse : function (o, is_callback) { + if(!o) { return false; } + if(!is_callback) { + vakata_context.html = ""; + vakata_context.items = []; + } + var str = "", + sep = false, + tmp; + + if(is_callback) { str += "<"+"ul>"; } + $.each(o, function (i, val) { + if(!val) { return true; } + vakata_context.items.push(val); + if(!sep && val.separator_before) { + str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + "> <"+"/a><"+"/li>"; + } + sep = false; + str += "<"+"li class='" + (val._class || "") + (val._disabled === true || ($.vakata.is_function(val._disabled) && val._disabled({ "item" : val, "reference" : vakata_context.reference, "element" : vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' "+(val.shortcut?" data-shortcut='"+val.shortcut+"' ":'')+">"; + str += "<"+"a href='#' rel='" + (vakata_context.items.length - 1) + "' " + (val.title ? "title='" + val.title + "'" : "") + ">"; + if($.vakata.context.settings.icons) { + str += "<"+"i "; + if(val.icon) { + if(val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; } + else { str += " class='" + val.icon + "' "; } + } + str += "><"+"/i><"+"span class='vakata-contextmenu-sep'> <"+"/span>"; + } + str += ($.vakata.is_function(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut?' '+ (val.shortcut_label || '') +'':'') + "<"+"/a>"; + if(val.submenu) { + tmp = $.vakata.context._parse(val.submenu, true); + if(tmp) { str += tmp; } + } + str += "<"+"/li>"; + if(val.separator_after) { + str += "<"+"li class='vakata-context-separator'><"+"a href='#' " + ($.vakata.context.settings.icons ? '' : 'class="vakata-context-no-icons"') + "> <"+"/a><"+"/li>"; + sep = true; + } + }); + str = str.replace(/
  • <\/li\>$/,""); + if(is_callback) { str += ""; } + /** + * triggered on the document when the contextmenu is parsed (HTML is built) + * @event + * @plugin contextmenu + * @name context_parse.vakata + * @param {jQuery} reference the element that was right clicked + * @param {jQuery} element the DOM element of the menu itself + * @param {Object} position the x & y coordinates of the menu + */ + if(!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); } + return str.length > 10 ? str : false; + }, + _show_submenu : function (o) { + o = $(o); + if(!o.length || !o.children("ul").length) { return; } + var e = o.children("ul"), + xl = o.offset().left, + x = xl + o.outerWidth(), + y = o.offset().top, + w = e.width(), + h = e.height(), + dw = $(window).width() + $(window).scrollLeft(), + dh = $(window).height() + $(window).scrollTop(); + // може да се спести е една проверка - дали няма някой от класовете вече нагоре + if(right_to_left) { + o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left"); + } + else { + o[x + w > dw && xl > dw - x ? "addClass" : "removeClass"]("vakata-context-right"); + } + if(y + h + 10 > dh) { + e.css("bottom","-1px"); + } + + //if does not fit - stick it to the side + if (o.hasClass('vakata-context-right')) { + if (xl < w) { + e.css("margin-right", xl - w); + } + } else { + if (dw - x < w) { + e.css("margin-left", dw - x - w); + } + } + + e.show(); + }, + show : function (reference, position, data) { + var o, e, x, y, w, h, dw, dh, cond = true; + if(vakata_context.element && vakata_context.element.length) { + vakata_context.element.width(''); + } + switch(cond) { + case (!position && !reference): + return false; + case (!!position && !!reference): + vakata_context.reference = reference; + vakata_context.position_x = position.x; + vakata_context.position_y = position.y; + break; + case (!position && !!reference): + vakata_context.reference = reference; + o = reference.offset(); + vakata_context.position_x = o.left + reference.outerHeight(); + vakata_context.position_y = o.top; + break; + case (!!position && !reference): + vakata_context.position_x = position.x; + vakata_context.position_y = position.y; + break; + } + if(!!reference && !data && $(reference).data('vakata_contextmenu')) { + data = $(reference).data('vakata_contextmenu'); + } + if($.vakata.context._parse(data)) { + vakata_context.element.html(vakata_context.html); + } + if(vakata_context.items.length) { + vakata_context.element.appendTo(document.body); + e = vakata_context.element; + x = vakata_context.position_x; + y = vakata_context.position_y; + w = e.width(); + h = e.height(); + dw = $(window).width() + $(window).scrollLeft(); + dh = $(window).height() + $(window).scrollTop(); + if(right_to_left) { + x -= (e.outerWidth() - $(reference).outerWidth()); + if(x < $(window).scrollLeft() + 20) { + x = $(window).scrollLeft() + 20; + } + } + if(x + w + 20 > dw) { + x = dw - (w + 20); + } + if(y + h + 20 > dh) { + y = dh - (h + 20); + } + + vakata_context.element + .css({ "left" : x, "top" : y }) + .show() + .find('a').first().trigger('focus').parent().addClass("vakata-context-hover"); + vakata_context.is_visible = true; + /** + * triggered on the document when the contextmenu is shown + * @event + * @plugin contextmenu + * @name context_show.vakata + * @param {jQuery} reference the element that was right clicked + * @param {jQuery} element the DOM element of the menu itself + * @param {Object} position the x & y coordinates of the menu + */ + $.vakata.context._trigger("show"); + } + }, + hide : function () { + if(vakata_context.is_visible) { + vakata_context.element.hide().find("ul").hide().end().find(':focus').trigger('blur').end().detach(); + vakata_context.is_visible = false; + /** + * triggered on the document when the contextmenu is hidden + * @event + * @plugin contextmenu + * @name context_hide.vakata + * @param {jQuery} reference the element that was right clicked + * @param {jQuery} element the DOM element of the menu itself + * @param {Object} position the x & y coordinates of the menu + */ + $.vakata.context._trigger("hide"); + } + } + }; + $(function () { + right_to_left = $(document.body).css("direction") === "rtl"; + var to = false; + + vakata_context.element = $("
      "); + vakata_context.element + .on("mouseenter", "li", function (e) { + e.stopImmediatePropagation(); + + if($.contains(this, e.relatedTarget)) { + // премахнато заради delegate mouseleave по-долу + // $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); + return; + } + + if(to) { clearTimeout(to); } + vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(); + + $(this) + .siblings().find("ul").hide().end().end() + .parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover"); + $.vakata.context._show_submenu(this); + }) + // тестово - дали не натоварва? + .on("mouseleave", "li", function (e) { + if($.contains(this, e.relatedTarget)) { return; } + $(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover"); + }) + .on("mouseleave", function (e) { + $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); + if($.vakata.context.settings.hide_onmouseleave) { + to = setTimeout( + (function (t) { + return function () { $.vakata.context.hide(); }; + }(this)), $.vakata.context.settings.hide_onmouseleave); + } + }) + .on("click", "a", function (e) { + e.preventDefault(); + //}) + //.on("mouseup", "a", function (e) { + if(!$(this).trigger('blur').parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) { + $.vakata.context.hide(); + } + }) + .on('keydown', 'a', function (e) { + var o = null; + switch(e.which) { + case 13: + case 32: + e.type = "click"; + e.preventDefault(); + $(e.currentTarget).trigger(e); + break; + case 37: + if(vakata_context.is_visible) { + vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').trigger('focus'); + e.stopImmediatePropagation(); + e.preventDefault(); + } + break; + case 38: + if(vakata_context.is_visible) { + o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first(); + if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); } + o.addClass("vakata-context-hover").children('a').trigger('focus'); + e.stopImmediatePropagation(); + e.preventDefault(); + } + break; + case 39: + if(vakata_context.is_visible) { + vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').trigger('focus'); + e.stopImmediatePropagation(); + e.preventDefault(); + } + break; + case 40: + if(vakata_context.is_visible) { + o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first(); + if(!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); } + o.addClass("vakata-context-hover").children('a').trigger('focus'); + e.stopImmediatePropagation(); + e.preventDefault(); + } + break; + case 27: + $.vakata.context.hide(); + e.preventDefault(); + break; + default: + //console.log(e.which); + break; + } + }) + .on('keydown', function (e) { + e.preventDefault(); + var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent(); + if(a.parent().not('.vakata-context-disabled')) { + a.trigger('click'); + } + }); + + $(document) + .on("mousedown.vakata.jstree", function (e) { + if(vakata_context.is_visible && vakata_context.element[0] !== e.target && !$.contains(vakata_context.element[0], e.target)) { + $.vakata.context.hide(); + } + }) + .on("context_show.vakata.jstree", function (e, data) { + vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"); + if(right_to_left) { + vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl"); + } + // also apply a RTL class? + vakata_context.element.find("ul").hide().end(); + }); + }); + }($)); + // $.jstree.defaults.plugins.push("contextmenu"); + + +/** + * ### Drag'n'drop plugin + * + * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations. + */ + + /** + * stores all defaults for the drag'n'drop plugin + * @name $.jstree.defaults.dnd + * @plugin dnd + */ + $.jstree.defaults.dnd = { + /** + * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`. + * @name $.jstree.defaults.dnd.copy + * @plugin dnd + */ + copy : true, + /** + * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`. + * @name $.jstree.defaults.dnd.open_timeout + * @plugin dnd + */ + open_timeout : 500, + /** + * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging + * @name $.jstree.defaults.dnd.is_draggable + * @plugin dnd + */ + is_draggable : true, + /** + * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true` + * @name $.jstree.defaults.dnd.check_while_dragging + * @plugin dnd + */ + check_while_dragging : true, + /** + * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false` + * @name $.jstree.defaults.dnd.always_copy + * @plugin dnd + */ + always_copy : false, + /** + * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0` + * @name $.jstree.defaults.dnd.inside_pos + * @plugin dnd + */ + inside_pos : 0, + /** + * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node + * @name $.jstree.defaults.dnd.drag_selection + * @plugin dnd + */ + drag_selection : true, + /** + * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices. + * @name $.jstree.defaults.dnd.touch + * @plugin dnd + */ + touch : true, + /** + * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target. + * @name $.jstree.defaults.dnd.large_drop_target + * @plugin dnd + */ + large_drop_target : false, + /** + * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected". + * @name $.jstree.defaults.dnd.large_drag_target + * @plugin dnd + */ + large_drag_target : false, + /** + * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls. + * @reference http://caniuse.com/#feat=dragndrop + * @name $.jstree.defaults.dnd.use_html5 + * @plugin dnd + */ + use_html5: false, + /** + * controls whether items can be dropped anywhere on the tree. + * @name $.jstree.defaults.dnd.blank_space_drop + * @plugin dnd + */ + blank_space_drop: false + }; + var drg, elm; + // TODO: now check works by checking for each node individually, how about max_children, unique, etc? + $.jstree.plugins.dnd = function (options, parent) { + this.init = function (el, options) { + parent.init.call(this, el, options); + this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span')); + }; + this.bind = function () { + parent.bind.call(this); + + this.element + .on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', function (e) { + if(this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) { + return true; + } + if(e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) { + return true; + } + var obj = this.get_node(e.target), + mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1, + txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget)); + if(this.settings.core.force_text) { + txt = $.vakata.html.escape(txt); + } + if(obj && (obj.id || obj.id === 0) && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") && + (this.settings.dnd.is_draggable === true || ($.vakata.is_function(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e))) + ) { + drg = { 'jstree' : true, 'origin' : this, 'obj' : this.get_node(obj,true), 'nodes' : mlt > 1 ? this.get_top_selected() : [obj.id] }; + elm = e.currentTarget; + if (this.settings.dnd.use_html5) { + $.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg }); + } else { + this.element.trigger('mousedown.jstree'); + return $.vakata.dnd.start(e, drg, '
      ' + txt + '+
      '); + } + } + }.bind(this)); + if (this.settings.dnd.use_html5) { + this.element + .on('dragover.jstree', function (e) { + e.preventDefault(); + $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); + return false; + }) + //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) { + // e.preventDefault(); + // $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); + // return false; + // }, this)) + .on('drop.jstree', function (e) { + e.preventDefault(); + $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); + return false; + }.bind(this)); + } + }; + this.redraw_node = function(obj, deep, callback, force_render) { + obj = parent.redraw_node.apply(this, arguments); + if (obj && this.settings.dnd.use_html5) { + if (this.settings.dnd.large_drag_target) { + obj.setAttribute('draggable', true); + } else { + var i, j, tmp = null; + for(i = 0, j = obj.childNodes.length; i < j; i++) { + if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { + tmp = obj.childNodes[i]; + break; + } + } + if(tmp) { + tmp.setAttribute('draggable', true); + } + } + } + return obj; + }; + }; + + $(function() { + // bind only once for all instances + var lastmv = false, + laster = false, + lastev = false, + opento = false, + marker = $('
       
      ').hide(); //.appendTo('body'); + + $(document) + .on('dragover.vakata.jstree', function (e) { + if (elm) { + $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); + } + }) + .on('drop.vakata.jstree', function (e) { + if (elm) { + $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); + elm = null; + drg = null; + } + }) + .on('dnd_start.vakata.jstree', function (e, data) { + lastmv = false; + lastev = false; + if(!data || !data.data || !data.data.jstree) { return; } + marker.appendTo(document.body); //.show(); + }) + .on('dnd_move.vakata.jstree', function (e, data) { + var isDifferentNode = data.event.target !== lastev.target; + if(opento) { + if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { + clearTimeout(opento); + } + } + if(!data || !data.data || !data.data.jstree) { return; } + + // if we are hovering the marker image do nothing (can happen on "inside" drags) + if(data.event.target.id && data.event.target.id === 'jstree-marker') { + return; + } + lastev = data.event; + + var ins = $.jstree.reference(data.event.target), + ref = false, + off = false, + rel = false, + tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn, c; + // if we are over an instance + if(ins && ins._data && ins._data.dnd) { + marker.attr('class', 'jstree-' + ins.get_theme() + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' )); + is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))); + data.helper + .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + ( ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '' )) + .find('.jstree-copy').first()[ is_copy ? 'show' : 'hide' ](); + + // if are hovering the container itself add a new root node + //console.log(data.event); + if( (data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && (ins.get_container_ul().children().length === 0 || ins.settings.dnd.blank_space_drop)) { + ok = true; + for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { + ok = ok && ins.check( (data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey)) ) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }); + if(!ok) { break; } + } + if(ok) { + lastmv = { 'ins' : ins, 'par' : $.jstree.root, 'pos' : 'last' }; + marker.hide(); + data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); + if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { + data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; + } + return; + } + } + else { + // if we are hovering a tree node + ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor'); + + if(ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) { + off = ref.offset(); + rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top; + h = ref.outerHeight(); + if(rel < h / 3) { + o = ['b', 'i', 'a']; + } + else if(rel > h - h / 3) { + o = ['a', 'i', 'b']; + } + else { + o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a']; + } + $.each(o, function (j, v) { + switch(v) { + case 'b': + l = off.left - 6; + t = off.top; + p = ins.get_parent(ref); + i = ref.parent().index(); + c = 'jstree-below'; + break; + case 'i': + ip = ins.settings.dnd.inside_pos; + tm = ins.get_node(ref.parent()); + l = off.left - 2; + t = off.top + h / 2 + 1; + p = tm.id; + i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length)); + c = 'jstree-inside'; + break; + case 'a': + l = off.left - 6; + t = off.top + h; + p = ins.get_parent(ref); + i = ref.parent().index() + 1; + c = 'jstree-above'; + break; + } + ok = true; + for(t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { + op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node"; + ps = i; + if(op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) { + pr = ins.get_node(p); + if(ps > $.inArray(data.data.nodes[t1], pr.children)) { + ps -= 1; + } + } + ok = ok && ( (ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }) ); + if(!ok) { + if(ins && ins.last_error) { laster = ins.last_error(); } + break; + } + } + if(v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) { + if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { + if (opento) { clearTimeout(opento); } + opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout); + } + } + if(ok) { + pn = ins.get_node(p, true); + if (!pn.hasClass('.jstree-dnd-parent')) { + $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); + pn.addClass('jstree-dnd-parent'); + } + lastmv = { 'ins' : ins, 'par' : p, 'pos' : v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i }; + marker.css({ 'left' : l + 'px', 'top' : t + 'px' }).show(); + marker.removeClass('jstree-above jstree-inside jstree-below').addClass(c); + data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); + if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { + data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; + } + laster = {}; + o = true; + return false; + } + }); + if(o === true) { return; } + } + } + } + $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); + lastmv = false; + data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er'); + if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { + //data.event.originalEvent.dataTransfer.dropEffect = 'none'; + } + marker.hide(); + }) + .on('dnd_scroll.vakata.jstree', function (e, data) { + if(!data || !data.data || !data.data.jstree) { return; } + marker.hide(); + lastmv = false; + lastev = false; + data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er'); + }) + .on('dnd_stop.vakata.jstree', function (e, data) { + $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); + if(opento) { clearTimeout(opento); } + if(!data || !data.data || !data.data.jstree) { return; } + marker.hide().detach(); + var i, j, nodes = []; + if(lastmv) { + for(i = 0, j = data.data.nodes.length; i < j; i++) { + nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i]; + } + lastmv.ins[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node' ](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin); + } + else { + i = $(data.event.target).closest('.jstree'); + if(i.length && laster && laster.error && laster.error === 'check') { + i = i.jstree(true); + if(i) { + i.settings.core.error.call(this, laster); + } + } + } + lastev = false; + lastmv = false; + }) + .on('keyup.jstree keydown.jstree', function (e, data) { + data = $.vakata.dnd._get(); + if(data && data.data && data.data.jstree) { + if (e.type === "keyup" && e.which === 27) { + if (opento) { clearTimeout(opento); } + lastmv = false; + laster = false; + lastev = false; + opento = false; + marker.hide().detach(); + $.vakata.dnd._clean(); + } else { + data.helper.find('.jstree-copy').first()[ data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide' ](); + if(lastev) { + lastev.metaKey = e.metaKey; + lastev.ctrlKey = e.ctrlKey; + $.vakata.dnd._trigger('move', lastev); + } + } + } + }); + }); + + // helpers + (function ($) { + $.vakata.html = { + div : $('
      '), + escape : function (str) { + return $.vakata.html.div.text(str).html(); + }, + strip : function (str) { + return $.vakata.html.div.empty().append($.parseHTML(str)).text(); + } + }; + // private variable + var vakata_dnd = { + element : false, + target : false, + is_down : false, + is_drag : false, + helper : false, + helper_w: 0, + data : false, + init_x : 0, + init_y : 0, + scroll_l: 0, + scroll_t: 0, + scroll_e: false, + scroll_i: false, + is_touch: false + }; + $.vakata.dnd = { + settings : { + scroll_speed : 10, + scroll_proximity : 20, + helper_left : 5, + helper_top : 10, + threshold : 5, + threshold_touch : 10 + }, + _trigger : function (event_name, e, data) { + if (data === undefined) { + data = $.vakata.dnd._get(); + } + data.event = e; + $(document).triggerHandler("dnd_" + event_name + ".vakata", data); + }, + _get : function () { + return { + "data" : vakata_dnd.data, + "element" : vakata_dnd.element, + "helper" : vakata_dnd.helper + }; + }, + _clean : function () { + if(vakata_dnd.helper) { vakata_dnd.helper.remove(); } + if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } + vakata_dnd = { + element : false, + target : false, + is_down : false, + is_drag : false, + helper : false, + helper_w: 0, + data : false, + init_x : 0, + init_y : 0, + scroll_l: 0, + scroll_t: 0, + scroll_e: false, + scroll_i: false, + is_touch: false + }; + elm = null; + $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); + $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); + }, + _scroll : function (init_only) { + if(!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) { + if(vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } + return false; + } + if(!vakata_dnd.scroll_i) { + vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100); + return false; + } + if(init_only === true) { return false; } + + var i = vakata_dnd.scroll_e.scrollTop(), + j = vakata_dnd.scroll_e.scrollLeft(); + vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed); + vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed); + if(i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) { + /** + * triggered on the document when a drag causes an element to scroll + * @event + * @plugin dnd + * @name dnd_scroll.vakata + * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start + * @param {DOM} element the DOM element being dragged + * @param {jQuery} helper the helper shown next to the mouse + * @param {jQuery} event the element that is scrolling + */ + $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e); + } + }, + start : function (e, data, html) { + if(e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { + e.pageX = e.originalEvent.changedTouches[0].pageX; + e.pageY = e.originalEvent.changedTouches[0].pageY; + e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); + } + if(vakata_dnd.is_drag) { $.vakata.dnd.stop({}); } + try { + e.currentTarget.unselectable = "on"; + e.currentTarget.onselectstart = function() { return false; }; + if(e.currentTarget.style) { + e.currentTarget.style.touchAction = "none"; + e.currentTarget.style.msTouchAction = "none"; + e.currentTarget.style.MozUserSelect = "none"; + } + } catch(ignore) { } + vakata_dnd.init_x = e.pageX; + vakata_dnd.init_y = e.pageY; + vakata_dnd.data = data; + vakata_dnd.is_down = true; + vakata_dnd.element = e.currentTarget; + vakata_dnd.target = e.target; + vakata_dnd.is_touch = e.type === "touchstart"; + if(html !== false) { + vakata_dnd.helper = $("
      ").html(html).css({ + "display" : "block", + "margin" : "0", + "padding" : "0", + "position" : "absolute", + "top" : "-2000px", + "lineHeight" : "16px", + "zIndex" : "10000" + }); + } + $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); + $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); + return false; + }, + drag : function (e) { + if(e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { + e.pageX = e.originalEvent.changedTouches[0].pageX; + e.pageY = e.originalEvent.changedTouches[0].pageY; + e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); + } + if(!vakata_dnd.is_down) { return; } + if(!vakata_dnd.is_drag) { + if( + Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) || + Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) + ) { + if(vakata_dnd.helper) { + vakata_dnd.helper.appendTo(document.body); + vakata_dnd.helper_w = vakata_dnd.helper.outerWidth(); + } + vakata_dnd.is_drag = true; + $(vakata_dnd.target).one('click.vakata', false); + /** + * triggered on the document when a drag starts + * @event + * @plugin dnd + * @name dnd_start.vakata + * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start + * @param {DOM} element the DOM element being dragged + * @param {jQuery} helper the helper shown next to the mouse + * @param {Object} event the event that caused the start (probably mousemove) + */ + $.vakata.dnd._trigger("start", e); + } + else { return; } + } + + var d = false, w = false, + dh = false, wh = false, + dw = false, ww = false, + dt = false, dl = false, + ht = false, hl = false; + + vakata_dnd.scroll_t = 0; + vakata_dnd.scroll_l = 0; + vakata_dnd.scroll_e = false; + $($(e.target).parentsUntil("body").addBack().get().reverse()) + .filter(function () { + return this.ownerDocument && (/^auto|scroll$/).test($(this).css("overflow")) && + (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth); + }) + .each(function () { + var t = $(this), o = t.offset(); + if(this.scrollHeight > this.offsetHeight) { + if(o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } + if(e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } + } + if(this.scrollWidth > this.offsetWidth) { + if(o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } + if(e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } + } + if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) { + vakata_dnd.scroll_e = $(this); + return false; + } + }); + + if(!vakata_dnd.scroll_e) { + d = $(document); w = $(window); + dh = d.height(); wh = w.height(); + dw = d.width(); ww = w.width(); + dt = d.scrollTop(); dl = d.scrollLeft(); + if(dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } + if(dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } + if(dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } + if(dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } + if(vakata_dnd.scroll_t || vakata_dnd.scroll_l) { + vakata_dnd.scroll_e = d; + } + } + if(vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); } + + if(vakata_dnd.helper) { + ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10); + hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10); + if(dh && ht + 25 > dh) { ht = dh - 50; } + if(dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); } + vakata_dnd.helper.css({ + left : hl + "px", + top : ht + "px" + }); + } + /** + * triggered on the document when a drag is in progress + * @event + * @plugin dnd + * @name dnd_move.vakata + * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start + * @param {DOM} element the DOM element being dragged + * @param {jQuery} helper the helper shown next to the mouse + * @param {Object} event the event that caused this to trigger (most likely mousemove) + */ + $.vakata.dnd._trigger("move", e); + return false; + }, + stop : function (e) { + if(e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { + e.pageX = e.originalEvent.changedTouches[0].pageX; + e.pageY = e.originalEvent.changedTouches[0].pageY; + e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); + } + if(vakata_dnd.is_drag) { + /** + * triggered on the document when a drag stops (the dragged element is dropped) + * @event + * @plugin dnd + * @name dnd_stop.vakata + * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start + * @param {DOM} element the DOM element being dragged + * @param {jQuery} helper the helper shown next to the mouse + * @param {Object} event the event that caused the stop + */ + if (e.target !== vakata_dnd.target) { + $(vakata_dnd.target).off('click.vakata'); + } + $.vakata.dnd._trigger("stop", e); + } + else { + if(e.type === "touchend" && e.target === vakata_dnd.target) { + var to = setTimeout(function () { $(e.target).trigger('click'); }, 100); + $(e.target).one('click', function() { if(to) { clearTimeout(to); } }); + } + } + $.vakata.dnd._clean(); + return false; + } + }; + }($)); + + // include the dnd plugin by default + // $.jstree.defaults.plugins.push("dnd"); + + +/** + * ### Massload plugin + * + * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading). + */ + + /** + * massload configuration + * + * It is possible to set this to a standard jQuery-like AJAX config. + * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used. + * + * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result. + * + * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array. + * + * { + * "id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }], + * "id2" : [{ "text" : "Child of ID2", "id" : "c3" }] + * } + * + * @name $.jstree.defaults.massload + * @plugin massload + */ + $.jstree.defaults.massload = null; + $.jstree.plugins.massload = function (options, parent) { + this.init = function (el, options) { + this._data.massload = {}; + parent.init.call(this, el, options); + }; + this._load_nodes = function (nodes, callback, is_callback, force_reload) { + var s = this.settings.massload, + toLoad = [], + m = this._model.data, + i, j, dom; + if (!is_callback) { + for(i = 0, j = nodes.length; i < j; i++) { + if(!m[nodes[i]] || ( (!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload) ) { + toLoad.push(nodes[i]); + dom = this.get_node(nodes[i], true); + if (dom && dom.length) { + dom.addClass("jstree-loading").attr('aria-busy',true); + } + } + } + this._data.massload = {}; + if (toLoad.length) { + if($.vakata.is_function(s)) { + return s.call(this, toLoad, function (data) { + var i, j; + if(data) { + for(i in data) { + if(data.hasOwnProperty(i)) { + this._data.massload[i] = data[i]; + } + } + } + for(i = 0, j = nodes.length; i < j; i++) { + dom = this.get_node(nodes[i], true); + if (dom && dom.length) { + dom.removeClass("jstree-loading").attr('aria-busy',false); + } + } + parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); + }.bind(this)); + } + if(typeof s === 'object' && s && s.url) { + s = $.extend(true, {}, s); + if($.vakata.is_function(s.url)) { + s.url = s.url.call(this, toLoad); + } + if($.vakata.is_function(s.data)) { + s.data = s.data.call(this, toLoad); + } + return $.ajax(s) + .done(function (data,t,x) { + var i, j; + if(data) { + for(i in data) { + if(data.hasOwnProperty(i)) { + this._data.massload[i] = data[i]; + } + } + } + for(i = 0, j = nodes.length; i < j; i++) { + dom = this.get_node(nodes[i], true); + if (dom && dom.length) { + dom.removeClass("jstree-loading").attr('aria-busy',false); + } + } + parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); + }.bind(this)) + .fail(function (f) { + parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); + }.bind(this)); + } + } + } + return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); + }; + this._load_node = function (obj, callback) { + var data = this._data.massload[obj.id], + rslt = null, dom; + if(data) { + rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data']( + obj, + typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data, + function (status) { callback.call(this, status); } + ); + dom = this.get_node(obj.id, true); + if (dom && dom.length) { + dom.removeClass("jstree-loading").attr('aria-busy',false); + } + delete this._data.massload[obj.id]; + return rslt; + } + return parent._load_node.call(this, obj, callback); + }; + }; + + +/** + * ### Search plugin + * + * Adds search functionality to jsTree. + */ + + /** + * stores all defaults for the search plugin + * @name $.jstree.defaults.search + * @plugin search + */ + $.jstree.defaults.search = { + /** + * a jQuery-like AJAX config, which jstree uses if a server should be queried for results. + * + * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed. + * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to + * @name $.jstree.defaults.search.ajax + * @plugin search + */ + ajax : false, + /** + * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`. + * @name $.jstree.defaults.search.fuzzy + * @plugin search + */ + fuzzy : false, + /** + * Indicates if the search should be case sensitive. Default is `false`. + * @name $.jstree.defaults.search.case_sensitive + * @plugin search + */ + case_sensitive : false, + /** + * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers). + * This setting can be changed at runtime when calling the search method. Default is `false`. + * @name $.jstree.defaults.search.show_only_matches + * @plugin search + */ + show_only_matches : false, + /** + * Indicates if the children of matched element are shown (when show_only_matches is true) + * This setting can be changed at runtime when calling the search method. Default is `false`. + * @name $.jstree.defaults.search.show_only_matches_children + * @plugin search + */ + show_only_matches_children : false, + /** + * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`. + * @name $.jstree.defaults.search.close_opened_onclear + * @plugin search + */ + close_opened_onclear : true, + /** + * Indicates if only leaf nodes should be included in search results. Default is `false`. + * @name $.jstree.defaults.search.search_leaves_only + * @plugin search + */ + search_leaves_only : false, + /** + * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution). + * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`. + * @name $.jstree.defaults.search.search_callback + * @plugin search + */ + search_callback : false + }; + + $.jstree.plugins.search = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + + this._data.search.str = ""; + this._data.search.dom = $(); + this._data.search.res = []; + this._data.search.opn = []; + this._data.search.som = false; + this._data.search.smc = false; + this._data.search.hdn = []; + + this.element + .on("search.jstree", function (e, data) { + if(this._data.search.som && data.res.length) { + var m = this._model.data, i, j, p = [], k, l; + for(i = 0, j = data.res.length; i < j; i++) { + if(m[data.res[i]] && !m[data.res[i]].state.hidden) { + p.push(data.res[i]); + p = p.concat(m[data.res[i]].parents); + if(this._data.search.smc) { + for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) { + if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) { + p.push(m[data.res[i]].children_d[k]); + } + } + } + } + } + p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root); + this._data.search.hdn = this.hide_all(true); + this.show_node(p, true); + this.redraw(true); + } + }.bind(this)) + .on("clear_search.jstree", function (e, data) { + if(this._data.search.som && data.res.length) { + this.show_node(this._data.search.hdn, true); + this.redraw(true); + } + }.bind(this)); + }; + /** + * used to search the tree nodes for a given string + * @name search(str [, skip_async]) + * @param {String} str the search string + * @param {Boolean} skip_async if set to true server will not be queried even if configured + * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers) + * @param {mixed} inside an optional node to whose children to limit the search + * @param {Boolean} append if set to true the results of this search are appended to the previous search + * @plugin search + * @trigger search.jstree + */ + this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) { + if(str === false || $.vakata.trim(str.toString()) === "") { + return this.clear_search(); + } + inside = this.get_node(inside); + inside = inside && (inside.id || inside.id === 0) ? inside.id : null; + str = str.toString(); + var s = this.settings.search, + a = s.ajax ? s.ajax : false, + m = this._model.data, + f = null, + r = [], + p = [], i, j; + if(this._data.search.res.length && !append) { + this.clear_search(); + } + if(show_only_matches === undefined) { + show_only_matches = s.show_only_matches; + } + if(show_only_matches_children === undefined) { + show_only_matches_children = s.show_only_matches_children; + } + if(!skip_async && a !== false) { + if($.vakata.is_function(a)) { + return a.call(this, str, function (d) { + if(d && d.d) { d = d.d; } + this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () { + this.search(str, true, show_only_matches, inside, append, show_only_matches_children); + }); + }.bind(this), inside); + } + else { + a = $.extend({}, a); + if(!a.data) { a.data = {}; } + a.data.str = str; + if(inside) { + a.data.inside = inside; + } + if (this._data.search.lastRequest) { + this._data.search.lastRequest.abort(); + } + this._data.search.lastRequest = $.ajax(a) + .fail(function () { + this._data.core.last_error = { 'error' : 'ajax', 'plugin' : 'search', 'id' : 'search_01', 'reason' : 'Could not load search parents', 'data' : JSON.stringify(a) }; + this.settings.core.error.call(this, this._data.core.last_error); + }.bind(this)) + .done(function (d) { + if(d && d.d) { d = d.d; } + this._load_nodes(!$.vakata.is_array(d) ? [] : $.vakata.array_unique(d), function () { + this.search(str, true, show_only_matches, inside, append, show_only_matches_children); + }); + }.bind(this)); + return this._data.search.lastRequest; + } + } + if(!append) { + this._data.search.str = str; + this._data.search.dom = $(); + this._data.search.res = []; + this._data.search.opn = []; + this._data.search.som = show_only_matches; + this._data.search.smc = show_only_matches_children; + } + + f = new $.vakata.search(str, true, { caseSensitive : s.case_sensitive, fuzzy : s.fuzzy }); + $.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) { + var v = m[i]; + if(v.text && !v.state.hidden && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) && ( (s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch) ) ) { + r.push(i); + p = p.concat(v.parents); + } + }); + if(r.length) { + p = $.vakata.array_unique(p); + for(i = 0, j = p.length; i < j; i++) { + if(p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) { + this._data.search.opn.push(p[i]); + } + } + if(!append) { + this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #'))); + this._data.search.res = r; + } + else { + this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); }).join(', #')))); + this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r)); + } + this._data.search.dom.children(".jstree-anchor").addClass('jstree-search'); + } + /** + * triggered after search is complete + * @event + * @name search.jstree + * @param {jQuery} nodes a jQuery collection of matching nodes + * @param {String} str the search string + * @param {Array} res a collection of objects represeing the matching nodes + * @plugin search + */ + this.trigger('search', { nodes : this._data.search.dom, str : str, res : this._data.search.res, show_only_matches : show_only_matches }); + }; + /** + * used to clear the last search (removes classes and shows all nodes if filtering is on) + * @name clear_search() + * @plugin search + * @trigger clear_search.jstree + */ + this.clear_search = function () { + if(this.settings.search.close_opened_onclear) { + this.close_node(this._data.search.opn, 0); + } + /** + * triggered after search is complete + * @event + * @name clear_search.jstree + * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search) + * @param {String} str the search string (the last search string) + * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search) + * @plugin search + */ + this.trigger('clear_search', { 'nodes' : this._data.search.dom, str : this._data.search.str, res : this._data.search.res }); + if(this._data.search.res.length) { + this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) { + return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex,'\\$&') : v.replace($.jstree.idregex,'\\$&'); + }).join(', #'))); + this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search"); + } + this._data.search.str = ""; + this._data.search.res = []; + this._data.search.opn = []; + this._data.search.dom = $(); + }; + + this.redraw_node = function(obj, deep, callback, force_render) { + obj = parent.redraw_node.apply(this, arguments); + if(obj) { + if($.inArray(obj.id, this._data.search.res) !== -1) { + var i, j, tmp = null; + for(i = 0, j = obj.childNodes.length; i < j; i++) { + if(obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { + tmp = obj.childNodes[i]; + break; + } + } + if(tmp) { + tmp.className += ' jstree-search'; + } + } + } + return obj; + }; + }; + + // helpers + (function ($) { + // from http://kiro.me/projects/fuse.html + $.vakata.search = function(pattern, txt, options) { + options = options || {}; + options = $.extend({}, $.vakata.search.defaults, options); + if(options.fuzzy !== false) { + options.fuzzy = true; + } + pattern = options.caseSensitive ? pattern : pattern.toLowerCase(); + var MATCH_LOCATION = options.location, + MATCH_DISTANCE = options.distance, + MATCH_THRESHOLD = options.threshold, + patternLen = pattern.length, + matchmask, pattern_alphabet, match_bitapScore, search; + if(patternLen > 32) { + options.fuzzy = false; + } + if(options.fuzzy) { + matchmask = 1 << (patternLen - 1); + pattern_alphabet = (function () { + var mask = {}, + i = 0; + for (i = 0; i < patternLen; i++) { + mask[pattern.charAt(i)] = 0; + } + for (i = 0; i < patternLen; i++) { + mask[pattern.charAt(i)] |= 1 << (patternLen - i - 1); + } + return mask; + }()); + match_bitapScore = function (e, x) { + var accuracy = e / patternLen, + proximity = Math.abs(MATCH_LOCATION - x); + if(!MATCH_DISTANCE) { + return proximity ? 1.0 : accuracy; + } + return accuracy + (proximity / MATCH_DISTANCE); + }; + } + search = function (text) { + text = options.caseSensitive ? text.toString() : text.toString().toLowerCase(); + if(pattern === text || text.indexOf(pattern) !== -1) { + return { + isMatch: true, + score: 0 + }; + } + if(!options.fuzzy) { + return { + isMatch: false, + score: 1 + }; + } + var i, j, + textLen = text.length, + scoreThreshold = MATCH_THRESHOLD, + bestLoc = text.indexOf(pattern, MATCH_LOCATION), + binMin, binMid, + binMax = patternLen + textLen, + lastRd, start, finish, rd, charMatch, + score = 1, + locations = []; + if (bestLoc !== -1) { + scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); + bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen); + if (bestLoc !== -1) { + scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); + } + } + bestLoc = -1; + for (i = 0; i < patternLen; i++) { + binMin = 0; + binMid = binMax; + while (binMin < binMid) { + if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) { + binMin = binMid; + } else { + binMax = binMid; + } + binMid = Math.floor((binMax - binMin) / 2 + binMin); + } + binMax = binMid; + start = Math.max(1, MATCH_LOCATION - binMid + 1); + finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen; + rd = new Array(finish + 2); + rd[finish + 1] = (1 << i) - 1; + for (j = finish; j >= start; j--) { + charMatch = pattern_alphabet[text.charAt(j - 1)]; + if (i === 0) { + rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; + } else { + rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1]; + } + if (rd[j] & matchmask) { + score = match_bitapScore(i, j - 1); + if (score <= scoreThreshold) { + scoreThreshold = score; + bestLoc = j - 1; + locations.push(bestLoc); + if (bestLoc > MATCH_LOCATION) { + start = Math.max(1, 2 * MATCH_LOCATION - bestLoc); + } else { + break; + } + } + } + } + if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) { + break; + } + lastRd = rd; + } + return { + isMatch: bestLoc >= 0, + score: score + }; + }; + return txt === true ? { 'search' : search } : search(txt); + }; + $.vakata.search.defaults = { + location : 0, + distance : 100, + threshold : 0.6, + fuzzy : false, + caseSensitive : false + }; + }($)); + + // include the search plugin by default + // $.jstree.defaults.plugins.push("search"); + + +/** + * ### Sort plugin + * + * Automatically sorts all siblings in the tree according to a sorting function. + */ + + /** + * the settings function used to sort the nodes. + * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`. + * @name $.jstree.defaults.sort + * @plugin sort + */ + $.jstree.defaults.sort = function (a, b) { + //return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b); + return this.get_text(a) > this.get_text(b) ? 1 : -1; + }; + $.jstree.plugins.sort = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + this.element + .on("model.jstree", function (e, data) { + this.sort(data.parent, true); + }.bind(this)) + .on("rename_node.jstree create_node.jstree", function (e, data) { + this.sort(data.parent || data.node.parent, false); + this.redraw_node(data.parent || data.node.parent, true); + }.bind(this)) + .on("move_node.jstree copy_node.jstree", function (e, data) { + this.sort(data.parent, false); + this.redraw_node(data.parent, true); + }.bind(this)); + }; + /** + * used to sort a node's children + * @private + * @name sort(obj [, deep]) + * @param {mixed} obj the node + * @param {Boolean} deep if set to `true` nodes are sorted recursively. + * @plugin sort + * @trigger search.jstree + */ + this.sort = function (obj, deep) { + var i, j; + obj = this.get_node(obj); + if(obj && obj.children && obj.children.length) { + obj.children.sort(this.settings.sort.bind(this)); + if(deep) { + for(i = 0, j = obj.children_d.length; i < j; i++) { + this.sort(obj.children_d[i], false); + } + } + } + }; + }; + + // include the sort plugin by default + // $.jstree.defaults.plugins.push("sort"); + +/** + * ### State plugin + * + * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc) + */ + + var to = false; + /** + * stores all defaults for the state plugin + * @name $.jstree.defaults.state + * @plugin state + */ + $.jstree.defaults.state = { + /** + * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`. + * @name $.jstree.defaults.state.key + * @plugin state + */ + key : 'jstree', + /** + * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`. + * @name $.jstree.defaults.state.events + * @plugin state + */ + events : 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree', + /** + * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire. + * @name $.jstree.defaults.state.ttl + * @plugin state + */ + ttl : false, + /** + * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state. + * @name $.jstree.defaults.state.filter + * @plugin state + */ + filter : false, + /** + * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false` + * @name $.jstree.defaults.state.preserve_loaded + * @plugin state + */ + preserve_loaded : false + }; + $.jstree.plugins.state = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + var bind = function () { + this.element.on(this.settings.state.events, function () { + if(to) { clearTimeout(to); } + to = setTimeout(function () { this.save_state(); }.bind(this), 100); + }.bind(this)); + /** + * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore). + * @event + * @name state_ready.jstree + * @plugin state + */ + this.trigger('state_ready'); + }.bind(this); + this.element + .on("ready.jstree", function (e, data) { + this.element.one("restore_state.jstree", bind); + if(!this.restore_state()) { bind(); } + }.bind(this)); + }; + /** + * save the state + * @name save_state() + * @plugin state + */ + this.save_state = function () { + var tm = this.get_state(); + if (!this.settings.state.preserve_loaded) { + delete tm.core.loaded; + } + var st = { 'state' : tm, 'ttl' : this.settings.state.ttl, 'sec' : +(new Date()) }; + $.vakata.storage.set(this.settings.state.key, JSON.stringify(st)); + }; + /** + * restore the state from the user's computer + * @name restore_state() + * @plugin state + */ + this.restore_state = function () { + var k = $.vakata.storage.get(this.settings.state.key); + if(!!k) { try { k = JSON.parse(k); } catch(ex) { return false; } } + if(!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; } + if(!!k && k.state) { k = k.state; } + if(!!k && $.vakata.is_function(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); } + if(!!k) { + if (!this.settings.state.preserve_loaded) { + delete k.core.loaded; + } + this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state' : $.extend(true, {}, k) }); }); + this.set_state(k); + return true; + } + return false; + }; + /** + * clear the state on the user's computer + * @name clear_state() + * @plugin state + */ + this.clear_state = function () { + return $.vakata.storage.del(this.settings.state.key); + }; + }; + + (function ($, undefined) { + $.vakata.storage = { + // simply specifying the functions in FF throws an error + set : function (key, val) { return window.localStorage.setItem(key, val); }, + get : function (key) { return window.localStorage.getItem(key); }, + del : function (key) { return window.localStorage.removeItem(key); } + }; + }($)); + + // include the state plugin by default + // $.jstree.defaults.plugins.push("state"); + +/** + * ### Types plugin + * + * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group. + */ + + /** + * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional). + * + * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited. + * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited. + * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits. + * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme. + * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data) + * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data) + * + * There are two predefined types: + * + * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes. + * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified. + * + * @name $.jstree.defaults.types + * @plugin types + */ + $.jstree.defaults.types = { + 'default' : {} + }; + $.jstree.defaults.types[$.jstree.root] = {}; + + $.jstree.plugins.types = function (options, parent) { + this.init = function (el, options) { + var i, j; + if(options && options.types && options.types['default']) { + for(i in options.types) { + if(i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) { + for(j in options.types['default']) { + if(options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) { + options.types[i][j] = options.types['default'][j]; + } + } + } + } + } + parent.init.call(this, el, options); + this._model.data[$.jstree.root].type = $.jstree.root; + }; + this.refresh = function (skip_loading, forget_state) { + parent.refresh.call(this, skip_loading, forget_state); + this._model.data[$.jstree.root].type = $.jstree.root; + }; + this.bind = function () { + this.element + .on('model.jstree', function (e, data) { + var m = this._model.data, + dpc = data.nodes, + t = this.settings.types, + i, j, c = 'default', k; + for(i = 0, j = dpc.length; i < j; i++) { + c = 'default'; + if(m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) { + c = m[dpc[i]].original.type; + } + if(m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) { + c = m[dpc[i]].data.jstree.type; + } + m[dpc[i]].type = c; + if(m[dpc[i]].icon === true && t[c].icon !== undefined) { + m[dpc[i]].icon = t[c].icon; + } + if(t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') { + for (k in t[c].li_attr) { + if (t[c].li_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (m[dpc[i]].li_attr[k] === undefined) { + m[dpc[i]].li_attr[k] = t[c].li_attr[k]; + } + else if (k === 'class') { + m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class']; + } + } + } + } + if(t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') { + for (k in t[c].a_attr) { + if (t[c].a_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (m[dpc[i]].a_attr[k] === undefined) { + m[dpc[i]].a_attr[k] = t[c].a_attr[k]; + } + else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') { + m[dpc[i]].a_attr['href'] = t[c].a_attr['href']; + } + else if (k === 'class') { + m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class']; + } + } + } + } + } + m[$.jstree.root].type = $.jstree.root; + }.bind(this)); + parent.bind.call(this); + }; + this.get_json = function (obj, options, flat) { + var i, j, + m = this._model.data, + opt = options ? $.extend(true, {}, options, {no_id:false}) : {}, + tmp = parent.get_json.call(this, obj, opt, flat); + if(tmp === false) { return false; } + if($.vakata.is_array(tmp)) { + for(i = 0, j = tmp.length; i < j; i++) { + tmp[i].type = (tmp[i].id || tmp[i].id === 0) && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default"; + if(options && options.no_id) { + delete tmp[i].id; + if(tmp[i].li_attr && tmp[i].li_attr.id) { + delete tmp[i].li_attr.id; + } + if(tmp[i].a_attr && tmp[i].a_attr.id) { + delete tmp[i].a_attr.id; + } + } + } + } + else { + tmp.type = (tmp.id || tmp.id === 0) && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default"; + if(options && options.no_id) { + tmp = this._delete_ids(tmp); + } + } + return tmp; + }; + this._delete_ids = function (tmp) { + if($.vakata.is_array(tmp)) { + for(var i = 0, j = tmp.length; i < j; i++) { + tmp[i] = this._delete_ids(tmp[i]); + } + return tmp; + } + delete tmp.id; + if(tmp.li_attr && tmp.li_attr.id) { + delete tmp.li_attr.id; + } + if(tmp.a_attr && tmp.a_attr.id) { + delete tmp.a_attr.id; + } + if(tmp.children && $.vakata.is_array(tmp.children)) { + tmp.children = this._delete_ids(tmp.children); + } + return tmp; + }; + this.check = function (chk, obj, par, pos, more) { + if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } + obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj); + par = par && (par.id || par.id === 0) ? par : this.get_node(par); + var m = obj && (obj.id || obj.id === 0) ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j; + m = m && m._model && m._model.data ? m._model.data : null; + switch(chk) { + case "create_node": + case "move_node": + case "copy_node": + if(chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) { + tmp = this.get_rules(par); + if(tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_01', 'reason' : 'max_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + return false; + } + if(tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_02', 'reason' : 'valid_children prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + return false; + } + if(m && obj.children_d && obj.parents) { + d = 0; + for(i = 0, j = obj.children_d.length; i < j; i++) { + d = Math.max(d, m[obj.children_d[i]].parents.length); + } + d = d - obj.parents.length + 1; + } + if(d <= 0 || d === undefined) { d = 1; } + do { + if(tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'types', 'id' : 'types_03', 'reason' : 'max_depth prevents function: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + return false; + } + par = this.get_node(par.parent); + tmp = this.get_rules(par); + d++; + } while(par); + } + break; + } + return true; + }; + /** + * used to retrieve the type settings object for a node + * @name get_rules(obj) + * @param {mixed} obj the node to find the rules for + * @return {Object} + * @plugin types + */ + this.get_rules = function (obj) { + obj = this.get_node(obj); + if(!obj) { return false; } + var tmp = this.get_type(obj, true); + if(tmp.max_depth === undefined) { tmp.max_depth = -1; } + if(tmp.max_children === undefined) { tmp.max_children = -1; } + if(tmp.valid_children === undefined) { tmp.valid_children = -1; } + return tmp; + }; + /** + * used to retrieve the type string or settings object for a node + * @name get_type(obj [, rules]) + * @param {mixed} obj the node to find the rules for + * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned + * @return {String|Object} + * @plugin types + */ + this.get_type = function (obj, rules) { + obj = this.get_node(obj); + return (!obj) ? false : ( rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type); + }; + /** + * used to change a node's type + * @name set_type(obj, type) + * @param {mixed} obj the node to change + * @param {String} type the new type + * @plugin types + */ + this.set_type = function (obj, type) { + var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a; + if($.vakata.is_array(obj)) { + obj = obj.slice(); + for(t1 = 0, t2 = obj.length; t1 < t2; t1++) { + this.set_type(obj[t1], type); + } + return true; + } + t = this.settings.types; + obj = this.get_node(obj); + if(!t[type] || !obj) { return false; } + d = this.get_node(obj, true); + if (d && d.length) { + a = d.children('.jstree-anchor'); + } + old_type = obj.type; + old_icon = this.get_icon(obj); + obj.type = type; + if(old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) { + this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true); + } + + // remove old type props + if(t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') { + for (k in t[old_type].li_attr) { + if (t[old_type].li_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (k === 'class') { + m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], ''); + if (d) { d.removeClass(t[old_type].li_attr[k]); } + } + else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) { + m[obj.id].li_attr[k] = null; + if (d) { d.removeAttr(k); } + } + } + } + } + if(t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') { + for (k in t[old_type].a_attr) { + if (t[old_type].a_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (k === 'class') { + m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], ''); + if (a) { a.removeClass(t[old_type].a_attr[k]); } + } + else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) { + if (k === 'href') { + m[obj.id].a_attr[k] = '#'; + if (a) { a.attr('href', '#'); } + } + else { + delete m[obj.id].a_attr[k]; + if (a) { a.removeAttr(k); } + } + } + } + } + } + + // add new props + if(t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') { + for (k in t[type].li_attr) { + if (t[type].li_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (m[obj.id].li_attr[k] === undefined) { + m[obj.id].li_attr[k] = t[type].li_attr[k]; + if (d) { + if (k === 'class') { + d.addClass(t[type].li_attr[k]); + } + else { + d.attr(k, t[type].li_attr[k]); + } + } + } + else if (k === 'class') { + m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class']; + if (d) { d.addClass(t[type].li_attr[k]); } + } + } + } + } + if(t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') { + for (k in t[type].a_attr) { + if (t[type].a_attr.hasOwnProperty(k)) { + if (k === 'id') { + continue; + } + else if (m[obj.id].a_attr[k] === undefined) { + m[obj.id].a_attr[k] = t[type].a_attr[k]; + if (a) { + if (k === 'class') { + a.addClass(t[type].a_attr[k]); + } + else { + a.attr(k, t[type].a_attr[k]); + } + } + } + else if (k === 'href' && m[obj.id].a_attr[k] === '#') { + m[obj.id].a_attr['href'] = t[type].a_attr['href']; + if (a) { a.attr('href', t[type].a_attr['href']); } + } + else if (k === 'class') { + m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class']; + if (a) { a.addClass(t[type].a_attr[k]); } + } + } + } + } + + return true; + }; + }; + // include the types plugin by default + // $.jstree.defaults.plugins.push("types"); + + +/** + * ### Unique plugin + * + * Enforces that no nodes with the same name can coexist as siblings. + */ + + /** + * stores all defaults for the unique plugin + * @name $.jstree.defaults.unique + * @plugin unique + */ + $.jstree.defaults.unique = { + /** + * Indicates if the comparison should be case sensitive. Default is `false`. + * @name $.jstree.defaults.unique.case_sensitive + * @plugin unique + */ + case_sensitive : false, + /** + * Indicates if white space should be trimmed before the comparison. Default is `false`. + * @name $.jstree.defaults.unique.trim_whitespace + * @plugin unique + */ + trim_whitespace : false, + /** + * A callback executed in the instance's scope when a new node is created with no name and a node with the default name already exists, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`. + * @name $.jstree.defaults.unique.duplicate + * @plugin unique + */ + duplicate : function (name, counter) { + return name + ' (' + counter + ')'; + } + }; + + $.jstree.plugins.unique = function (options, parent) { + this.check = function (chk, obj, par, pos, more) { + if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } + obj = obj && (obj.id || obj.id === 0) ? obj : this.get_node(obj); + par = par && (par.id || par.id === 0) ? par : this.get_node(par); + if(!par || !par.children) { return true; } + var n = chk === "rename_node" ? pos : obj.text, + c = [], + s = this.settings.unique.case_sensitive, + w = this.settings.unique.trim_whitespace, + m = this._model.data, i, j, t; + for(i = 0, j = par.children.length; i < j; i++) { + t = m[par.children[i]].text; + if (!s) { + t = t.toLowerCase(); + } + if (w) { + t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + c.push(t); + } + if(!s) { n = n.toLowerCase(); } + if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } + switch(chk) { + case "delete_node": + return true; + case "rename_node": + t = obj.text || ''; + if (!s) { + t = t.toLowerCase(); + } + if (w) { + t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + i = ($.inArray(n, c) === -1 || (obj.text && t === n)); + if(!i) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_01', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + } + return i; + case "create_node": + i = ($.inArray(n, c) === -1); + if(!i) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_04', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + } + return i; + case "copy_node": + i = ($.inArray(n, c) === -1); + if(!i) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_02', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + } + return i; + case "move_node": + i = ( (obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1); + if(!i) { + this._data.core.last_error = { 'error' : 'check', 'plugin' : 'unique', 'id' : 'unique_03', 'reason' : 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data' : JSON.stringify({ 'chk' : chk, 'pos' : pos, 'obj' : obj && (obj.id || obj.id === 0) ? obj.id : false, 'par' : par && (par.id || par.id === 0) ? par.id : false }) }; + } + return i; + } + return true; + }; + this.create_node = function (par, node, pos, callback, is_loaded) { + if(!node || (typeof node === 'object' && node.text === undefined)) { + if(par === null) { + par = $.jstree.root; + } + par = this.get_node(par); + if(!par) { + return parent.create_node.call(this, par, node, pos, callback, is_loaded); + } + pos = pos === undefined ? "last" : pos; + if(!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { + return parent.create_node.call(this, par, node, pos, callback, is_loaded); + } + if(!node) { node = {}; } + var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t; + n = tmp = this.get_string('New node'); + dpc = []; + for(i = 0, j = par.children.length; i < j; i++) { + t = m[par.children[i]].text; + if (!s) { + t = t.toLowerCase(); + } + if (w) { + t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + dpc.push(t); + } + i = 1; + t = n; + if (!s) { + t = t.toLowerCase(); + } + if (w) { + t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + while($.inArray(t, dpc) !== -1) { + n = cb.call(this, tmp, (++i)).toString(); + t = n; + if (!s) { + t = t.toLowerCase(); + } + if (w) { + t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } + } + node.text = n; + } + return parent.create_node.call(this, par, node, pos, callback, is_loaded); + }; + }; + + // include the unique plugin by default + // $.jstree.defaults.plugins.push("unique"); + + +/** + * ### Wholerow plugin + * + * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers. + */ + + var div = document.createElement('DIV'); + div.setAttribute('unselectable','on'); + div.setAttribute('role','presentation'); + div.className = 'jstree-wholerow'; + div.innerHTML = ' '; + $.jstree.plugins.wholerow = function (options, parent) { + this.bind = function () { + parent.bind.call(this); + + this.element + .on('ready.jstree set_state.jstree', function () { + this.hide_dots(); + }.bind(this)) + .on("init.jstree loading.jstree ready.jstree", function () { + //div.style.height = this._data.core.li_height + 'px'; + this.get_container_ul().addClass('jstree-wholerow-ul'); + }.bind(this)) + .on("deselect_all.jstree", function (e, data) { + this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); + }.bind(this)) + .on("changed.jstree", function (e, data) { + this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); + var tmp = false, i, j; + for(i = 0, j = data.selected.length; i < j; i++) { + tmp = this.get_node(data.selected[i], true); + if(tmp && tmp.length) { + tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); + } + } + }.bind(this)) + .on("open_node.jstree", function (e, data) { + this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); + }.bind(this)) + .on("hover_node.jstree dehover_node.jstree", function (e, data) { + if(e.type === "hover_node" && this.is_disabled(data.node)) { return; } + this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node"?"addClass":"removeClass"]('jstree-wholerow-hovered'); + }.bind(this)) + .on("contextmenu.jstree", ".jstree-wholerow", function (e) { + if (this._data.contextmenu) { + e.preventDefault(); + var tmp = $.Event('contextmenu', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey, pageX : e.pageX, pageY : e.pageY }); + $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp); + } + }.bind(this)) + /*! + .on("mousedown.jstree touchstart.jstree", ".jstree-wholerow", function (e) { + if(e.target === e.currentTarget) { + var a = $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor"); + e.target = a[0]; + a.trigger(e); + } + }) + */ + .on("click.jstree", ".jstree-wholerow", function (e) { + e.stopImmediatePropagation(); + var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); + $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); + }) + .on("dblclick.jstree", ".jstree-wholerow", function (e) { + e.stopImmediatePropagation(); + var tmp = $.Event('dblclick', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); + $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); + }) + .on("click.jstree", ".jstree-leaf > .jstree-ocl", function (e) { + e.stopImmediatePropagation(); + var tmp = $.Event('click', { metaKey : e.metaKey, ctrlKey : e.ctrlKey, altKey : e.altKey, shiftKey : e.shiftKey }); + $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).trigger('focus'); + }.bind(this)) + .on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", function (e) { + e.stopImmediatePropagation(); + if(!this.is_disabled(e.currentTarget)) { + this.hover_node(e.currentTarget); + } + return false; + }.bind(this)) + .on("mouseleave.jstree", ".jstree-node", function (e) { + this.dehover_node(e.currentTarget); + }.bind(this)); + }; + this.teardown = function () { + if(this.settings.wholerow) { + this.element.find(".jstree-wholerow").remove(); + } + parent.teardown.call(this); + }; + this.redraw_node = function(obj, deep, callback, force_render) { + obj = parent.redraw_node.apply(this, arguments); + if(obj) { + var tmp = div.cloneNode(true); + //tmp.style.height = this._data.core.li_height + 'px'; + if($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; } + if(this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; } + obj.insertBefore(tmp, obj.childNodes[0]); + } + return obj; + }; + }; + // include the wholerow plugin by default + // $.jstree.defaults.plugins.push("wholerow"); + if(window.customElements && Object && Object.create) { + var proto = Object.create(HTMLElement.prototype); + proto.createdCallback = function () { + var c = { core : {}, plugins : [] }, i; + for(i in $.jstree.plugins) { + if($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) { + c.plugins.push(i); + if(this.getAttribute(i) && JSON.parse(this.getAttribute(i))) { + c[i] = JSON.parse(this.getAttribute(i)); + } + } + } + for(i in $.jstree.defaults.core) { + if($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) { + c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i); + } + } + $(this).jstree(c); + }; + // proto.attributeChangedCallback = function (name, previous, value) { }; + try { + window.customElements.define("vakata-jstree", function() {}, { prototype: proto }); + } catch (ignore) { } + } + +})); \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/default/32px.png b/dms_field/static/lib/jsTree/themes/default/32px.png new file mode 100644 index 000000000..153271524 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/default/32px.png differ diff --git a/dms_field/static/lib/jsTree/themes/default/40px.png b/dms_field/static/lib/jsTree/themes/default/40px.png new file mode 100644 index 000000000..1959347ae Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/default/40px.png differ diff --git a/dms_field/static/lib/jsTree/themes/default/style.css b/dms_field/static/lib/jsTree/themes/default/style.css new file mode 100644 index 000000000..7fc61cf76 --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/default/style.css @@ -0,0 +1,1102 @@ +/* jsTree default theme */ +.jstree-node, +.jstree-children, +.jstree-container-ul { + display: block; + margin: 0; + padding: 0; + list-style-type: none; + list-style-image: none; +} +.jstree-node { + white-space: nowrap; +} +.jstree-anchor { + display: inline-block; + color: black; + white-space: nowrap; + padding: 0 4px 0 1px; + margin: 0; + vertical-align: top; +} +.jstree-anchor:focus { + outline: 0; +} +.jstree-anchor, +.jstree-anchor:link, +.jstree-anchor:visited, +.jstree-anchor:hover, +.jstree-anchor:active { + text-decoration: none; + color: inherit; +} +.jstree-icon { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0; + vertical-align: top; + text-align: center; +} +.jstree-icon:empty { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0; + vertical-align: top; + text-align: center; +} +.jstree-ocl { + cursor: pointer; +} +.jstree-leaf > .jstree-ocl { + cursor: default; +} +.jstree .jstree-open > .jstree-children { + display: block; +} +.jstree .jstree-closed > .jstree-children, +.jstree .jstree-leaf > .jstree-children { + display: none; +} +.jstree-anchor > .jstree-themeicon { + margin-right: 2px; +} +.jstree-no-icons .jstree-themeicon, +.jstree-anchor > .jstree-themeicon-hidden { + display: none; +} +.jstree-hidden, +.jstree-node.jstree-hidden { + display: none; +} +.jstree-rtl .jstree-anchor { + padding: 0 1px 0 4px; +} +.jstree-rtl .jstree-anchor > .jstree-themeicon { + margin-left: 2px; + margin-right: 0; +} +.jstree-rtl .jstree-node { + margin-left: 0; +} +.jstree-rtl .jstree-container-ul > .jstree-node { + margin-right: 0; +} +.jstree-wholerow-ul { + position: relative; + display: inline-block; + min-width: 100%; +} +.jstree-wholerow-ul .jstree-leaf > .jstree-ocl { + cursor: pointer; +} +.jstree-wholerow-ul .jstree-anchor, +.jstree-wholerow-ul .jstree-icon { + position: relative; +} +.jstree-wholerow-ul .jstree-wholerow { + width: 100%; + cursor: pointer; + position: absolute; + left: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.jstree-contextmenu .jstree-anchor { + -webkit-user-select: none; + /* disable selection/Copy of UIWebView */ + -webkit-touch-callout: none; + /* disable the IOS popup when long-press on a link */ +} +.vakata-context { + display: none; +} +.vakata-context, +.vakata-context ul { + margin: 0; + padding: 2px; + position: absolute; + background: #f5f5f5; + border: 1px solid #979797; + box-shadow: 2px 2px 2px #999999; +} +.vakata-context ul { + list-style: none; + left: 100%; + margin-top: -2.7em; + margin-left: -4px; +} +.vakata-context .vakata-context-right ul { + left: auto; + right: 100%; + margin-left: auto; + margin-right: -4px; +} +.vakata-context li { + list-style: none; +} +.vakata-context li > a { + display: block; + padding: 0 2em 0 2em; + text-decoration: none; + width: auto; + color: black; + white-space: nowrap; + line-height: 2.4em; + text-shadow: 1px 1px 0 white; + border-radius: 1px; +} +.vakata-context li > a:hover { + position: relative; + background-color: #e8eff7; + box-shadow: 0 0 2px #0a6aa1; +} +.vakata-context li > a.vakata-context-parent { + background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); + background-position: right center; + background-repeat: no-repeat; +} +.vakata-context li > a:focus { + outline: 0; +} +.vakata-context .vakata-context-hover > a { + position: relative; + background-color: #e8eff7; + box-shadow: 0 0 2px #0a6aa1; +} +.vakata-context .vakata-context-separator > a, +.vakata-context .vakata-context-separator > a:hover { + background: white; + border: 0; + border-top: 1px solid #e2e3e3; + height: 1px; + min-height: 1px; + max-height: 1px; + padding: 0; + margin: 0 0 0 2.4em; + border-left: 1px solid #e0e0e0; + text-shadow: 0 0 0 transparent; + box-shadow: 0 0 0 transparent; + border-radius: 0; +} +.vakata-context .vakata-contextmenu-disabled a, +.vakata-context .vakata-contextmenu-disabled a:hover { + color: silver; + background-color: transparent; + border: 0; + box-shadow: 0 0 0; +} +.vakata-context .vakata-contextmenu-disabled > a > i { + filter: grayscale(100%); +} +.vakata-context li > a > i { + text-decoration: none; + display: inline-block; + width: 2.4em; + height: 2.4em; + background: transparent; + margin: 0 0 0 -2em; + vertical-align: top; + text-align: center; + line-height: 2.4em; +} +.vakata-context li > a > i:empty { + width: 2.4em; + line-height: 2.4em; +} +.vakata-context li > a .vakata-contextmenu-sep { + display: inline-block; + width: 1px; + height: 2.4em; + background: white; + margin: 0 0.5em 0 0; + border-left: 1px solid #e2e3e3; +} +.vakata-context .vakata-contextmenu-shortcut { + font-size: 0.8em; + color: silver; + opacity: 0.5; + display: none; +} +.vakata-context-rtl ul { + left: auto; + right: 100%; + margin-left: auto; + margin-right: -4px; +} +.vakata-context-rtl li > a.vakata-context-parent { + background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); + background-position: left center; + background-repeat: no-repeat; +} +.vakata-context-rtl .vakata-context-separator > a { + margin: 0 2.4em 0 0; + border-left: 0; + border-right: 1px solid #e2e3e3; +} +.vakata-context-rtl .vakata-context-left ul { + right: auto; + left: 100%; + margin-left: -4px; + margin-right: auto; +} +.vakata-context-rtl li > a > i { + margin: 0 -2em 0 0; +} +.vakata-context-rtl li > a .vakata-contextmenu-sep { + margin: 0 0 0 0.5em; + border-left-color: white; + background: #e2e3e3; +} +#jstree-marker { + position: absolute; + top: 0; + left: 0; + margin: -5px 0 0 0; + padding: 0; + border-right: 0; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid; + width: 0; + height: 0; + font-size: 0; + line-height: 0; +} +#jstree-dnd { + line-height: 16px; + margin: 0; + padding: 4px; +} +#jstree-dnd .jstree-icon, +#jstree-dnd .jstree-copy { + display: inline-block; + text-decoration: none; + margin: 0 2px 0 0; + padding: 0; + width: 16px; + height: 16px; +} +#jstree-dnd .jstree-ok { + background: green; +} +#jstree-dnd .jstree-er { + background: red; +} +#jstree-dnd .jstree-copy { + margin: 0 2px 0 2px; +} +.jstree-default .jstree-node, +.jstree-default .jstree-icon { + background-repeat: no-repeat; + background-color: transparent; +} +.jstree-default .jstree-anchor, +.jstree-default .jstree-animated, +.jstree-default .jstree-wholerow { + transition: background-color 0.15s, box-shadow 0.15s; +} +.jstree-default .jstree-hovered { + background: #e7f4f9; + border-radius: 2px; + box-shadow: inset 0 0 1px #cccccc; +} +.jstree-default .jstree-context { + background: #e7f4f9; + border-radius: 2px; + box-shadow: inset 0 0 1px #cccccc; +} +.jstree-default .jstree-clicked { + background: #beebff; + border-radius: 2px; + box-shadow: inset 0 0 1px #999999; +} +.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon { + display: none; +} +.jstree-default .jstree-disabled { + background: transparent; + color: #666666; +} +.jstree-default .jstree-disabled.jstree-hovered { + background: transparent; + box-shadow: none; +} +.jstree-default .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-default .jstree-disabled > .jstree-icon { + opacity: 0.8; + filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); + /* Firefox 10+ */ + filter: gray; + /* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+ & Safari 6+ */ +} +.jstree-default .jstree-search { + font-style: italic; + color: #8b0000; + font-weight: bold; +} +.jstree-default .jstree-no-checkboxes .jstree-checkbox { + display: none !important; +} +.jstree-default.jstree-checkbox-no-clicked .jstree-clicked { + background: transparent; + box-shadow: none; +} +.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { + background: #e7f4f9; +} +.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { + background: transparent; +} +.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { + background: #e7f4f9; +} +.jstree-default > .jstree-striped { + min-width: 100%; + display: inline-block; + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; +} +.jstree-default > .jstree-wholerow-ul .jstree-hovered, +.jstree-default > .jstree-wholerow-ul .jstree-clicked { + background: transparent; + box-shadow: none; + border-radius: 0; +} +.jstree-default .jstree-wholerow { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.jstree-default .jstree-wholerow-hovered { + background: #e7f4f9; +} +.jstree-default .jstree-wholerow-clicked { + background: #beebff; + background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); + background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); +} +.jstree-default .jstree-node { + min-height: 24px; + line-height: 24px; + margin-left: 24px; + min-width: 24px; +} +.jstree-default .jstree-anchor { + line-height: 24px; + height: 24px; +} +.jstree-default .jstree-icon { + width: 24px; + height: 24px; + line-height: 24px; +} +.jstree-default .jstree-icon:empty { + width: 24px; + height: 24px; + line-height: 24px; +} +.jstree-default.jstree-rtl .jstree-node { + margin-right: 24px; +} +.jstree-default .jstree-wholerow { + height: 24px; +} +.jstree-default .jstree-node, +.jstree-default .jstree-icon { + background-image: url("32px.png"); +} +.jstree-default .jstree-node { + background-position: -292px -4px; + background-repeat: repeat-y; +} +.jstree-default .jstree-last { + background: transparent; +} +.jstree-default .jstree-open > .jstree-ocl { + background-position: -132px -4px; +} +.jstree-default .jstree-closed > .jstree-ocl { + background-position: -100px -4px; +} +.jstree-default .jstree-leaf > .jstree-ocl { + background-position: -68px -4px; +} +.jstree-default .jstree-themeicon { + background-position: -260px -4px; +} +.jstree-default > .jstree-no-dots .jstree-node, +.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -36px -4px; +} +.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -4px -4px; +} +.jstree-default .jstree-disabled { + background: transparent; +} +.jstree-default .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-default .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-default .jstree-checkbox { + background-position: -164px -4px; +} +.jstree-default .jstree-checkbox:hover { + background-position: -164px -36px; +} +.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-default .jstree-checked > .jstree-checkbox { + background-position: -228px -4px; +} +.jstree-default.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-default .jstree-checked > .jstree-checkbox:hover { + background-position: -228px -36px; +} +.jstree-default .jstree-anchor > .jstree-undetermined { + background-position: -196px -4px; +} +.jstree-default .jstree-anchor > .jstree-undetermined:hover { + background-position: -196px -36px; +} +.jstree-default .jstree-checkbox-disabled { + opacity: 0.8; + filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); + /* Firefox 10+ */ + filter: gray; + /* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+ & Safari 6+ */ +} +.jstree-default > .jstree-striped { + background-size: auto 48px; +} +.jstree-default.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-default.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-default.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -132px -36px; +} +.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -100px -36px; +} +.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -68px -36px; +} +.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -36px -36px; +} +.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -4px -36px; +} +.jstree-default .jstree-themeicon-custom { + background-color: transparent; + background-image: none; + background-position: 0 0; +} +.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-default .jstree-file { + background: url("32px.png") -100px -68px no-repeat; +} +.jstree-default .jstree-folder { + background: url("32px.png") -260px -4px no-repeat; +} +.jstree-default > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-default { + line-height: 24px; + padding: 0 4px; +} +#jstree-dnd.jstree-default .jstree-ok, +#jstree-dnd.jstree-default .jstree-er { + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-default i { + background: transparent; + width: 24px; + height: 24px; + line-height: 24px; +} +#jstree-dnd.jstree-default .jstree-ok { + background-position: -4px -68px; +} +#jstree-dnd.jstree-default .jstree-er { + background-position: -36px -68px; +} +.jstree-default .jstree-ellipsis { + overflow: hidden; +} +.jstree-default .jstree-ellipsis .jstree-anchor { + width: calc(100% - 29px); + text-overflow: ellipsis; + overflow: hidden; +} +.jstree-default.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); +} +.jstree-default.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-default-small .jstree-node { + min-height: 18px; + line-height: 18px; + margin-left: 18px; + min-width: 18px; +} +.jstree-default-small .jstree-anchor { + line-height: 18px; + height: 18px; +} +.jstree-default-small .jstree-icon { + width: 18px; + height: 18px; + line-height: 18px; +} +.jstree-default-small .jstree-icon:empty { + width: 18px; + height: 18px; + line-height: 18px; +} +.jstree-default-small.jstree-rtl .jstree-node { + margin-right: 18px; +} +.jstree-default-small .jstree-wholerow { + height: 18px; +} +.jstree-default-small .jstree-node, +.jstree-default-small .jstree-icon { + background-image: url("32px.png"); +} +.jstree-default-small .jstree-node { + background-position: -295px -7px; + background-repeat: repeat-y; +} +.jstree-default-small .jstree-last { + background: transparent; +} +.jstree-default-small .jstree-open > .jstree-ocl { + background-position: -135px -7px; +} +.jstree-default-small .jstree-closed > .jstree-ocl { + background-position: -103px -7px; +} +.jstree-default-small .jstree-leaf > .jstree-ocl { + background-position: -71px -7px; +} +.jstree-default-small .jstree-themeicon { + background-position: -263px -7px; +} +.jstree-default-small > .jstree-no-dots .jstree-node, +.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -39px -7px; +} +.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -7px -7px; +} +.jstree-default-small .jstree-disabled { + background: transparent; +} +.jstree-default-small .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-default-small .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-default-small .jstree-checkbox { + background-position: -167px -7px; +} +.jstree-default-small .jstree-checkbox:hover { + background-position: -167px -39px; +} +.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-default-small .jstree-checked > .jstree-checkbox { + background-position: -231px -7px; +} +.jstree-default-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-default-small .jstree-checked > .jstree-checkbox:hover { + background-position: -231px -39px; +} +.jstree-default-small .jstree-anchor > .jstree-undetermined { + background-position: -199px -7px; +} +.jstree-default-small .jstree-anchor > .jstree-undetermined:hover { + background-position: -199px -39px; +} +.jstree-default-small .jstree-checkbox-disabled { + opacity: 0.8; + filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); + /* Firefox 10+ */ + filter: gray; + /* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+ & Safari 6+ */ +} +.jstree-default-small > .jstree-striped { + background-size: auto 36px; +} +.jstree-default-small.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-default-small.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -135px -39px; +} +.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -103px -39px; +} +.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -71px -39px; +} +.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -39px -39px; +} +.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -7px -39px; +} +.jstree-default-small .jstree-themeicon-custom { + background-color: transparent; + background-image: none; + background-position: 0 0; +} +.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-default-small .jstree-file { + background: url("32px.png") -103px -71px no-repeat; +} +.jstree-default-small .jstree-folder { + background: url("32px.png") -263px -7px no-repeat; +} +.jstree-default-small > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-default-small { + line-height: 18px; + padding: 0 4px; +} +#jstree-dnd.jstree-default-small .jstree-ok, +#jstree-dnd.jstree-default-small .jstree-er { + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-default-small i { + background: transparent; + width: 18px; + height: 18px; + line-height: 18px; +} +#jstree-dnd.jstree-default-small .jstree-ok { + background-position: -7px -71px; +} +#jstree-dnd.jstree-default-small .jstree-er { + background-position: -39px -71px; +} +.jstree-default-small .jstree-ellipsis { + overflow: hidden; +} +.jstree-default-small .jstree-ellipsis .jstree-anchor { + width: calc(100% - 23px); + text-overflow: ellipsis; + overflow: hidden; +} +.jstree-default-small.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); +} +.jstree-default-small.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-default-large .jstree-node { + min-height: 32px; + line-height: 32px; + margin-left: 32px; + min-width: 32px; +} +.jstree-default-large .jstree-anchor { + line-height: 32px; + height: 32px; +} +.jstree-default-large .jstree-icon { + width: 32px; + height: 32px; + line-height: 32px; +} +.jstree-default-large .jstree-icon:empty { + width: 32px; + height: 32px; + line-height: 32px; +} +.jstree-default-large.jstree-rtl .jstree-node { + margin-right: 32px; +} +.jstree-default-large .jstree-wholerow { + height: 32px; +} +.jstree-default-large .jstree-node, +.jstree-default-large .jstree-icon { + background-image: url("32px.png"); +} +.jstree-default-large .jstree-node { + background-position: -288px 0px; + background-repeat: repeat-y; +} +.jstree-default-large .jstree-last { + background: transparent; +} +.jstree-default-large .jstree-open > .jstree-ocl { + background-position: -128px 0px; +} +.jstree-default-large .jstree-closed > .jstree-ocl { + background-position: -96px 0px; +} +.jstree-default-large .jstree-leaf > .jstree-ocl { + background-position: -64px 0px; +} +.jstree-default-large .jstree-themeicon { + background-position: -256px 0px; +} +.jstree-default-large > .jstree-no-dots .jstree-node, +.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -32px 0px; +} +.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: 0px 0px; +} +.jstree-default-large .jstree-disabled { + background: transparent; +} +.jstree-default-large .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-default-large .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-default-large .jstree-checkbox { + background-position: -160px 0px; +} +.jstree-default-large .jstree-checkbox:hover { + background-position: -160px -32px; +} +.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-default-large .jstree-checked > .jstree-checkbox { + background-position: -224px 0px; +} +.jstree-default-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-default-large .jstree-checked > .jstree-checkbox:hover { + background-position: -224px -32px; +} +.jstree-default-large .jstree-anchor > .jstree-undetermined { + background-position: -192px 0px; +} +.jstree-default-large .jstree-anchor > .jstree-undetermined:hover { + background-position: -192px -32px; +} +.jstree-default-large .jstree-checkbox-disabled { + opacity: 0.8; + filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); + /* Firefox 10+ */ + filter: gray; + /* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+ & Safari 6+ */ +} +.jstree-default-large > .jstree-striped { + background-size: auto 64px; +} +.jstree-default-large.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-default-large.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -128px -32px; +} +.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -96px -32px; +} +.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -64px -32px; +} +.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -32px -32px; +} +.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: 0px -32px; +} +.jstree-default-large .jstree-themeicon-custom { + background-color: transparent; + background-image: none; + background-position: 0 0; +} +.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-default-large .jstree-file { + background: url("32px.png") -96px -64px no-repeat; +} +.jstree-default-large .jstree-folder { + background: url("32px.png") -256px 0px no-repeat; +} +.jstree-default-large > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-default-large { + line-height: 32px; + padding: 0 4px; +} +#jstree-dnd.jstree-default-large .jstree-ok, +#jstree-dnd.jstree-default-large .jstree-er { + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-default-large i { + background: transparent; + width: 32px; + height: 32px; + line-height: 32px; +} +#jstree-dnd.jstree-default-large .jstree-ok { + background-position: 0px -64px; +} +#jstree-dnd.jstree-default-large .jstree-er { + background-position: -32px -64px; +} +.jstree-default-large .jstree-ellipsis { + overflow: hidden; +} +.jstree-default-large .jstree-ellipsis .jstree-anchor { + width: calc(100% - 37px); + text-overflow: ellipsis; + overflow: hidden; +} +.jstree-default-large.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); +} +.jstree-default-large.jstree-rtl .jstree-last { + background: transparent; +} +@media (max-width: 768px) { + #jstree-dnd.jstree-dnd-responsive { + line-height: 40px; + font-weight: bold; + font-size: 1.1em; + text-shadow: 1px 1px white; + } + #jstree-dnd.jstree-dnd-responsive > i { + background: transparent; + width: 40px; + height: 40px; + } + #jstree-dnd.jstree-dnd-responsive > .jstree-ok { + background-image: url("40px.png"); + background-position: 0 -200px; + background-size: 120px 240px; + } + #jstree-dnd.jstree-dnd-responsive > .jstree-er { + background-image: url("40px.png"); + background-position: -40px -200px; + background-size: 120px 240px; + } + #jstree-marker.jstree-dnd-responsive { + border-left-width: 10px; + border-top-width: 10px; + border-bottom-width: 10px; + margin-top: -10px; + } +} +@media (max-width: 768px) { + .jstree-default-responsive { + /* + .jstree-open > .jstree-ocl, + .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } + */ + } + .jstree-default-responsive .jstree-icon { + background-image: url("40px.png"); + } + .jstree-default-responsive .jstree-node, + .jstree-default-responsive .jstree-leaf > .jstree-ocl { + background: transparent; + } + .jstree-default-responsive .jstree-node { + min-height: 40px; + line-height: 40px; + margin-left: 40px; + min-width: 40px; + white-space: nowrap; + } + .jstree-default-responsive .jstree-anchor { + line-height: 40px; + height: 40px; + } + .jstree-default-responsive .jstree-icon, + .jstree-default-responsive .jstree-icon:empty { + width: 40px; + height: 40px; + line-height: 40px; + } + .jstree-default-responsive > .jstree-container-ul > .jstree-node { + margin-left: 0; + } + .jstree-default-responsive.jstree-rtl .jstree-node { + margin-left: 0; + margin-right: 40px; + background: transparent; + } + .jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node { + margin-right: 0; + } + .jstree-default-responsive .jstree-ocl, + .jstree-default-responsive .jstree-themeicon, + .jstree-default-responsive .jstree-checkbox { + background-size: 120px 240px; + } + .jstree-default-responsive .jstree-leaf > .jstree-ocl, + .jstree-default-responsive.jstree-rtl .jstree-leaf > .jstree-ocl { + background: transparent; + } + .jstree-default-responsive .jstree-open > .jstree-ocl { + background-position: 0 0 !important; + } + .jstree-default-responsive .jstree-closed > .jstree-ocl { + background-position: 0 -40px !important; + } + .jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -40px 0 !important; + } + .jstree-default-responsive .jstree-themeicon { + background-position: -40px -40px; + } + .jstree-default-responsive .jstree-checkbox, + .jstree-default-responsive .jstree-checkbox:hover { + background-position: -40px -80px; + } + .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, + .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, + .jstree-default-responsive .jstree-checked > .jstree-checkbox, + .jstree-default-responsive .jstree-checked > .jstree-checkbox:hover { + background-position: 0 -80px; + } + .jstree-default-responsive .jstree-anchor > .jstree-undetermined, + .jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover { + background-position: 0 -120px; + } + .jstree-default-responsive .jstree-anchor { + font-weight: bold; + font-size: 1.1em; + text-shadow: 1px 1px white; + } + .jstree-default-responsive > .jstree-striped { + background: transparent; + } + .jstree-default-responsive .jstree-wholerow { + border-top: 1px solid rgba(255, 255, 255, 0.7); + border-bottom: 1px solid rgba(64, 64, 64, 0.2); + background: #ebebeb; + height: 40px; + } + .jstree-default-responsive .jstree-wholerow-hovered { + background: #e7f4f9; + } + .jstree-default-responsive .jstree-wholerow-clicked { + background: #beebff; + } + .jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow { + box-shadow: inset 0 -6px 3px -5px #666666; + } + .jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow { + box-shadow: inset 0 6px 3px -5px #666666; + border-top: 0; + } + .jstree-default-responsive .jstree-children .jstree-open + .jstree-open { + box-shadow: none; + } + .jstree-default-responsive .jstree-node, + .jstree-default-responsive .jstree-icon, + .jstree-default-responsive .jstree-node > .jstree-ocl, + .jstree-default-responsive .jstree-themeicon, + .jstree-default-responsive .jstree-checkbox { + background-image: url("40px.png"); + background-size: 120px 240px; + } + .jstree-default-responsive .jstree-node { + background-position: -80px 0; + background-repeat: repeat-y; + } + .jstree-default-responsive .jstree-last { + background: transparent; + } + .jstree-default-responsive .jstree-leaf > .jstree-ocl { + background-position: -40px -120px; + } + .jstree-default-responsive .jstree-last > .jstree-ocl { + background-position: -40px -160px; + } + .jstree-default-responsive .jstree-themeicon-custom { + background-color: transparent; + background-image: none; + background-position: 0 0; + } + .jstree-default-responsive .jstree-file { + background: url("40px.png") 0 -160px no-repeat; + background-size: 120px 240px; + } + .jstree-default-responsive .jstree-folder { + background: url("40px.png") -40px -40px no-repeat; + background-size: 120px 240px; + } + .jstree-default-responsive > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; + } +} \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/default/throbber.gif b/dms_field/static/lib/jsTree/themes/default/throbber.gif new file mode 100644 index 000000000..1b5b2fde4 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/default/throbber.gif differ diff --git a/dms_field/static/lib/jsTree/themes/proton/30px.png b/dms_field/static/lib/jsTree/themes/proton/30px.png new file mode 100644 index 000000000..558215408 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/30px.png differ diff --git a/dms_field/static/lib/jsTree/themes/proton/32px.png b/dms_field/static/lib/jsTree/themes/proton/32px.png new file mode 100644 index 000000000..eb1db46fb Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/32px.png differ diff --git a/dms_field/static/lib/jsTree/themes/proton/LICENSE b/dms_field/static/lib/jsTree/themes/proton/LICENSE new file mode 100644 index 000000000..4efa7d081 --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/proton/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2014 Orange Hill Development + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot new file mode 100644 index 000000000..ec01fc363 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.eot differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.svg b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.svg new file mode 100644 index 000000000..e63084632 --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.svg @@ -0,0 +1,2377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf new file mode 100644 index 000000000..ea4ca8038 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.ttf differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff new file mode 100644 index 000000000..35ca59ec5 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-bold-webfont.woff differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot new file mode 100644 index 000000000..e6b9784fb Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.eot differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.svg b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.svg new file mode 100644 index 000000000..f6417b73e --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.svg @@ -0,0 +1,2410 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf new file mode 100644 index 000000000..e0b6ec330 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.ttf differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff new file mode 100644 index 000000000..0f297dbe3 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-extralight-webfont.woff differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot new file mode 100644 index 000000000..5c9e81aa1 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.eot differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.svg b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.svg new file mode 100644 index 000000000..ce508397c --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.svg @@ -0,0 +1,2725 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf new file mode 100644 index 000000000..f3adc9f1b Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.ttf differ diff --git a/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff new file mode 100644 index 000000000..475867805 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/fonts/titillium/titilliumweb-regular-webfont.woff differ diff --git a/dms_field/static/lib/jsTree/themes/proton/style.css b/dms_field/static/lib/jsTree/themes/proton/style.css new file mode 100644 index 000000000..781b38ea2 --- /dev/null +++ b/dms_field/static/lib/jsTree/themes/proton/style.css @@ -0,0 +1,1125 @@ +/* jsTree default theme */ +.jstree-node, +.jstree-children, +.jstree-container-ul { + display: block; + margin: 0; + padding: 0; + list-style-type: none; + list-style-image: none; +} +.jstree-node { + white-space: nowrap; +} +.jstree-anchor { + display: inline-block; + color: #333; + white-space: nowrap; + padding: 0 4px 0 1px; + margin: 0; + vertical-align: top; +} +.jstree-anchor:focus { + outline: 0; +} +.jstree-anchor, +.jstree-anchor:link, +.jstree-anchor:visited, +.jstree-anchor:hover, +.jstree-anchor:active { + text-decoration: none; + color: inherit; +} +.jstree-icon { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0; + vertical-align: top; + text-align: center; +} +.jstree-icon:empty { + display: inline-block; + text-decoration: none; + margin: 0; + padding: 0; + vertical-align: top; + text-align: center; +} +.jstree-ocl { + cursor: pointer; +} +.jstree-leaf > .jstree-ocl { + cursor: default; +} +.jstree .jstree-open > .jstree-children { + display: block; +} +.jstree .jstree-closed > .jstree-children, +.jstree .jstree-leaf > .jstree-children { + display: none; +} +.jstree-anchor > .jstree-themeicon { + margin-right: 2px; +} +.jstree-no-icons .jstree-themeicon, +.jstree-anchor > .jstree-themeicon-hidden { + display: none; +} +.jstree-rtl .jstree-anchor { + padding: 0 1px 0 4px; +} +.jstree-rtl .jstree-anchor > .jstree-themeicon { + margin-left: 2px; + margin-right: 0; +} +.jstree-rtl .jstree-node { + margin-left: 0; +} +.jstree-rtl .jstree-container-ul > .jstree-node { + margin-right: 0; +} +.jstree-wholerow-ul { + position: relative; + display: inline-block; + min-width: 100%; +} +.jstree-wholerow-ul .jstree-leaf > .jstree-ocl { + cursor: pointer; +} +.jstree-wholerow-ul .jstree-anchor, +.jstree-wholerow-ul .jstree-icon { + position: relative; +} +.jstree-wholerow-ul .jstree-wholerow { + width: 100%; + cursor: pointer; + position: absolute; + left: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.jstree-rename-input { + color: #000000; +} +.vakata-context { + display: none; +} +.vakata-context, +.vakata-context ul { + margin: 0; + padding: 2px; + position: absolute; + background: #f5f5f5; + border: 1px solid #979797; + -moz-box-shadow: 5px 5px 4px -4px #666666; + -webkit-box-shadow: 2px 2px 2px #999999; + box-shadow: 2px 2px 2px #999999; +} +.vakata-context ul { + list-style: none; + left: 100%; + margin-top: -2.7em; + margin-left: -4px; +} +.vakata-context .vakata-context-right ul { + left: auto; + right: 100%; + margin-left: auto; + margin-right: -4px; +} +.vakata-context li { + list-style: none; + display: inline; +} +.vakata-context li > a { + display: block; + padding: 0 2em 0 2em; + text-decoration: none; + width: auto; + color: black; + white-space: nowrap; + line-height: 2.4em; + -moz-text-shadow: 1px 1px 0 white; + -webkit-text-shadow: 1px 1px 0 white; + text-shadow: 1px 1px 0 white; + -moz-border-radius: 1px; + -webkit-border-radius: 1px; + border-radius: 1px; +} +.vakata-context li > a:hover { + position: relative; + background-color: #e8eff7; + -moz-box-shadow: 0 0 2px #0a6aa1; + -webkit-box-shadow: 0 0 2px #0a6aa1; + box-shadow: 0 0 2px #0a6aa1; +} +.vakata-context li > a.vakata-context-parent { + background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); + background-position: right center; + background-repeat: no-repeat; +} +.vakata-context li > a:focus { + outline: 0; +} +.vakata-context .vakata-context-hover > a { + position: relative; + background-color: #e8eff7; + -moz-box-shadow: 0 0 2px #0a6aa1; + -webkit-box-shadow: 0 0 2px #0a6aa1; + box-shadow: 0 0 2px #0a6aa1; +} +.vakata-context .vakata-context-separator > a, +.vakata-context .vakata-context-separator > a:hover { + background: white; + border: 0; + border-top: 1px solid #e2e3e3; + height: 1px; + min-height: 1px; + max-height: 1px; + padding: 0; + margin: 0 0 0 2.4em; + border-left: 1px solid #e0e0e0; + -moz-text-shadow: 0 0 0 transparent; + -webkit-text-shadow: 0 0 0 transparent; + text-shadow: 0 0 0 transparent; + -moz-box-shadow: 0 0 0 transparent; + -webkit-box-shadow: 0 0 0 transparent; + box-shadow: 0 0 0 transparent; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-radius: 0; +} +.vakata-context .vakata-contextmenu-disabled a, +.vakata-context .vakata-contextmenu-disabled a:hover { + color: silver; + background-color: transparent; + border: 0; + box-shadow: 0 0 0; +} +.vakata-context li > a > i { + text-decoration: none; + display: inline-block; + width: 2.4em; + height: 2.4em; + background: transparent; + margin: 0 0 0 -2em; + vertical-align: top; + text-align: center; + line-height: 2.4em; +} +.vakata-context li > a > i:empty { + width: 2.4em; + line-height: 2.4em; +} +.vakata-context li > a .vakata-contextmenu-sep { + display: inline-block; + width: 1px; + height: 2.4em; + background: white; + margin: 0 0.5em 0 0; + border-left: 1px solid #e2e3e3; +} +.vakata-context .vakata-contextmenu-shortcut { + font-size: 0.8em; + color: silver; + opacity: 0.5; + display: none; +} +.vakata-context-rtl ul { + left: auto; + right: 100%; + margin-left: auto; + margin-right: -4px; +} +.vakata-context-rtl li > a.vakata-context-parent { + background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); + background-position: left center; + background-repeat: no-repeat; +} +.vakata-context-rtl .vakata-context-separator > a { + margin: 0 2.4em 0 0; + border-left: 0; + border-right: 1px solid #e2e3e3; +} +.vakata-context-rtl .vakata-context-left ul { + right: auto; + left: 100%; + margin-left: -4px; + margin-right: auto; +} +.vakata-context-rtl li > a > i { + margin: 0 -2em 0 0; +} +.vakata-context-rtl li > a .vakata-contextmenu-sep { + margin: 0 0 0 0.5em; + border-left-color: white; + background: #e2e3e3; +} +#jstree-marker { + position: absolute; + top: 0; + left: 0; + margin: -5px 0 0 0; + padding: 0; + border-right: 0; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid; + width: 0; + height: 0; + font-size: 0; + line-height: 0; +} +#jstree-dnd { + line-height: 16px; + margin: 0; + padding: 4px; +} +#jstree-dnd .jstree-icon, +#jstree-dnd .jstree-copy { + display: inline-block; + text-decoration: none; + margin: 0 2px 0 0; + padding: 0; + width: 16px; + height: 16px; +} +#jstree-dnd .jstree-ok { + background: green; +} +#jstree-dnd .jstree-er { + background: red; +} +#jstree-dnd .jstree-copy { + margin: 0 2px 0 2px; +} +.jstree-proton .jstree-node, +.jstree-proton .jstree-icon { + background-repeat: no-repeat; + background-color: transparent; +} +.jstree-proton .jstree-anchor, +.jstree-proton .jstree-wholerow { + transition: background-color 0.15s, box-shadow 0.15s, color 0.15s; +} +.jstree-proton .jstree-hovered { + background: #76b6ec; + color: #ffffff; + border-radius: 3px; + box-shadow: inset 0 0 1px #76b6ec; +} +.jstree-proton .jstree-clicked { + background: #9d9d9d; + color: #ffffff; + border-radius: 3px; + box-shadow: inset 0 0 1px #9d9d9d; +} +.jstree-proton .jstree-no-icons .jstree-anchor > .jstree-themeicon { + display: none; +} +.jstree-proton .jstree-disabled { + background: transparent; + color: #666666; +} +.jstree-proton .jstree-disabled.jstree-hovered { + background: transparent; + box-shadow: none; +} +.jstree-proton .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-proton .jstree-disabled > .jstree-icon { + opacity: 0.8; + filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); + /* Firefox 10+ * +filter: gray; +/* IE6-9 */ + -webkit-filter: grayscale(100%); + /* Chrome 19+ & Safari 6+ */ +} +.jstree-proton .jstree-search { + font-style: italic; + color: #8b0000; + font-weight: bold; +} +.jstree-proton .jstree-no-checkboxes .jstree-checkbox { + display: none !important; +} +.jstree-proton.jstree-checkbox-no-clicked .jstree-clicked { + background: transparent; + color: inherit; + box-shadow: none; +} +.jstree-proton.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { + background: #76b6ec; + color: #ffffff; +} +.jstree-proton.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked { + background: transparent; + color: inherit; +} +.jstree-proton.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { + background: #76b6ec; + color: #ffffff; +} +.jstree-proton > .jstree-striped { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; +} +.jstree-proton > .jstree-wholerow-ul .jstree-hovered, +.jstree-proton > .jstree-wholerow-ul .jstree-clicked { + background: transparent; + box-shadow: none; + border-radius: 0; +} +.jstree-proton .jstree-wholerow { + -moz-box-sizing: border-box; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} +.jstree-proton .jstree-wholerow-hovered { + background: #76b6ec; +} +.jstree-proton .jstree-wholerow-clicked { + background: #9d9d9d; + background: -moz-linear-gradient(top, #9d9d9d 0%, #9d9d9d 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #9d9d9d), color-stop(100%, #9d9d9d)); + background: -webkit-linear-gradient(top, #9d9d9d 0%, #9d9d9d 100%); + background: -o-linear-gradient(top, #9d9d9d 0%, #9d9d9d 100%); + background: -ms-linear-gradient(top, #9d9d9d 0%, #9d9d9d 100%); + background: linear-gradient(to bottom, #9d9d9d 0%, #9d9d9d 100%); + /*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@color1', endColorstr='@color2',GradientType=0 );*/ +} +.jstree-proton .jstree-node { + min-height: 22px; + line-height: 22px; + margin-left: 22px; + min-width: 22px; +} +.jstree-proton .jstree-anchor { + line-height: 22px; + margin: 1px 0 2px; + height: 22px; +} +.jstree-proton .jstree-icon { + width: 22px; + height: 22px; + line-height: 22px; +} +.jstree-proton .jstree-icon:empty { + width: 22px; + height: 22px; + line-height: 22px; +} +.jstree-proton.jstree-rtl .jstree-node { + margin-right: 22px; +} +.jstree-proton .jstree-wholerow { + height: 22px; +} +.jstree-proton .jstree-node, +.jstree-proton .jstree-icon { + background-size: 320px 96px; + background-image: url("32px.png"); +} +.jstree-proton .jstree-node { + background-position: -293px -5px; + background-repeat: repeat-y; +} +.jstree-proton .jstree-last { + background: transparent; +} +.jstree-proton .jstree-open > .jstree-ocl { + background-position: -133px -5px; +} +.jstree-proton .jstree-closed > .jstree-ocl { + background-position: -101px -5px; +} +.jstree-proton .jstree-leaf > .jstree-ocl { + background-position: -69px -5px; +} +.jstree-proton .jstree-themeicon { + background-position: -261px -7px; +} +.jstree-proton > .jstree-no-dots .jstree-node, +.jstree-proton > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -37px -5px; +} +.jstree-proton > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -5px -5px; +} +.jstree-proton .jstree-disabled { + background: transparent; +} +.jstree-proton .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-proton .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-proton .jstree-checkbox { + background-position: -165px -5px; +} +.jstree-proton .jstree-checkbox:hover { + background-position: -165px -37px; +} +.jstree-proton.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-proton .jstree-checked > .jstree-checkbox { + background-position: -229px -5px; +} +.jstree-proton.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-proton .jstree-checked > .jstree-checkbox:hover { + background-position: -229px -37px; +} +.jstree-proton .jstree-anchor > .jstree-undetermined { + background-position: -197px -5px; +} +.jstree-proton .jstree-anchor > .jstree-undetermined:hover { + background-position: -197px -37px; +} +.jstree-proton > .jstree-striped { + background-size: auto 44px; +} +.jstree-proton.jstree-rtl .jstree-node { + background-size: 320px 96px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-proton.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-proton.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -133px -37px; +} +.jstree-proton.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -101px -37px; +} +.jstree-proton.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -69px -37px; +} +.jstree-proton.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-proton.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -37px -37px; +} +.jstree-proton.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -5px -37px; +} +.jstree-proton .jstree-themeicon-custom { + background-color: transparent; + background-size: 320px 96px; + background-image: none; + background-position: 0 0; +} +.jstree-proton > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-proton .jstree-file { + background: url("32px.png") -101px -69px no-repeat; +} +.jstree-proton .jstree-folder { + background: url("32px.png") -261px -5px no-repeat; +} +.jstree-proton > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-proton { + line-height: 22px; + padding: 0 4px; +} +#jstree-dnd.jstree-proton .jstree-ok, +#jstree-dnd.jstree-proton .jstree-er { + background-size: 320px 96px; + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-proton i { + background: transparent; + width: 22px; + height: 22px; + line-height: 22px; +} +#jstree-dnd.jstree-proton .jstree-ok { + background-position: -5px -69px; +} +#jstree-dnd.jstree-proton .jstree-er { + background-position: -37px -69px; +} +.jstree-proton.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); +} +.jstree-proton.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-proton-small .jstree-node { + min-height: 18px; + line-height: 18px; + margin-left: 18px; + min-width: 18px; +} +.jstree-proton-small .jstree-anchor { + line-height: 18px; + margin: 1px 0 2px; + height: 18px; +} +.jstree-proton-small .jstree-icon { + width: 18px; + height: 18px; + line-height: 18px; +} +.jstree-proton-small .jstree-icon:empty { + width: 18px; + height: 18px; + line-height: 18px; +} +.jstree-proton-small.jstree-rtl .jstree-node { + margin-right: 18px; +} +.jstree-proton-small .jstree-wholerow { + height: 18px; +} +.jstree-proton-small .jstree-node, +.jstree-proton-small .jstree-icon { + background-size: 320px 96px; + background-image: url("32px.png"); +} +.jstree-proton-small .jstree-node { + background-position: -295px -7px; + background-repeat: repeat-y; +} +.jstree-proton-small .jstree-last { + background: transparent; +} +.jstree-proton-small .jstree-open > .jstree-ocl { + background-position: -135px -7px; +} +.jstree-proton-small .jstree-closed > .jstree-ocl { + background-position: -103px -7px; +} +.jstree-proton-small .jstree-leaf > .jstree-ocl { + background-position: -71px -7px; +} +.jstree-proton-small .jstree-themeicon { + background-position: -263px -9px; +} +.jstree-proton-small > .jstree-no-dots .jstree-node, +.jstree-proton-small > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton-small > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -39px -7px; +} +.jstree-proton-small > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -7px -7px; +} +.jstree-proton-small .jstree-disabled { + background: transparent; +} +.jstree-proton-small .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-proton-small .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-proton-small .jstree-checkbox { + background-position: -167px -7px; +} +.jstree-proton-small .jstree-checkbox:hover { + background-position: -167px -39px; +} +.jstree-proton-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-proton-small .jstree-checked > .jstree-checkbox { + background-position: -231px -7px; +} +.jstree-proton-small.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-proton-small .jstree-checked > .jstree-checkbox:hover { + background-position: -231px -39px; +} +.jstree-proton-small .jstree-anchor > .jstree-undetermined { + background-position: -199px -7px; +} +.jstree-proton-small .jstree-anchor > .jstree-undetermined:hover { + background-position: -199px -39px; +} +.jstree-proton-small > .jstree-striped { + background-size: auto 36px; +} +.jstree-proton-small.jstree-rtl .jstree-node { + background-size: 320px 96px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-proton-small.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-proton-small.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -135px -39px; +} +.jstree-proton-small.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -103px -39px; +} +.jstree-proton-small.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -71px -39px; +} +.jstree-proton-small.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-proton-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -39px -39px; +} +.jstree-proton-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: -7px -39px; +} +.jstree-proton-small .jstree-themeicon-custom { + background-color: transparent; + background-size: 320px 96px; + background-image: none; + background-position: 0 0; +} +.jstree-proton-small > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-proton-small .jstree-file { + background: url("32px.png") -103px -71px no-repeat; +} +.jstree-proton-small .jstree-folder { + background: url("32px.png") -263px -7px no-repeat; +} +.jstree-proton-small > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-proton-small { + line-height: 18px; + padding: 0 4px; +} +#jstree-dnd.jstree-proton-small .jstree-ok, +#jstree-dnd.jstree-proton-small .jstree-er { + background-size: 320px 96px; + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-proton-small i { + background: transparent; + width: 18px; + height: 18px; + line-height: 18px; +} +#jstree-dnd.jstree-proton-small .jstree-ok { + background-position: -7px -71px; +} +#jstree-dnd.jstree-proton-small .jstree-er { + background-position: -39px -71px; +} +.jstree-proton-small.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); +} +.jstree-proton-small.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-proton-large .jstree-node { + min-height: 32px; + line-height: 32px; + margin-left: 32px; + min-width: 32px; +} +.jstree-proton-large .jstree-anchor { + line-height: 32px; + margin: 1px 0 2px; + height: 32px; +} +.jstree-proton-large .jstree-icon { + width: 32px; + height: 32px; + line-height: 32px; +} +.jstree-proton-large .jstree-icon:empty { + width: 32px; + height: 32px; + line-height: 32px; +} +.jstree-proton-large.jstree-rtl .jstree-node { + margin-right: 32px; +} +.jstree-proton-large .jstree-wholerow { + height: 32px; +} +.jstree-proton-large .jstree-node, +.jstree-proton-large .jstree-icon { + background-size: 320px 96px; + background-image: url("32px.png"); +} +.jstree-proton-large .jstree-node { + background-position: -288px 0px; + background-repeat: repeat-y; +} +.jstree-proton-large .jstree-last { + background: transparent; +} +.jstree-proton-large .jstree-open > .jstree-ocl { + background-position: -128px 0px; +} +.jstree-proton-large .jstree-closed > .jstree-ocl { + background-position: -96px 0px; +} +.jstree-proton-large .jstree-leaf > .jstree-ocl { + background-position: -64px 0px; +} +.jstree-proton-large .jstree-themeicon { + background-position: -256px -2px; +} +.jstree-proton-large > .jstree-no-dots .jstree-node, +.jstree-proton-large > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton-large > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -32px 0px; +} +.jstree-proton-large > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: 0px 0px; +} +.jstree-proton-large .jstree-disabled { + background: transparent; +} +.jstree-proton-large .jstree-disabled.jstree-hovered { + background: transparent; +} +.jstree-proton-large .jstree-disabled.jstree-clicked { + background: #efefef; +} +.jstree-proton-large .jstree-checkbox { + background-position: -160px 0px; +} +.jstree-proton-large .jstree-checkbox:hover { + background-position: -160px -32px; +} +.jstree-proton-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, +.jstree-proton-large .jstree-checked > .jstree-checkbox { + background-position: -224px 0px; +} +.jstree-proton-large.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, +.jstree-proton-large .jstree-checked > .jstree-checkbox:hover { + background-position: -224px -32px; +} +.jstree-proton-large .jstree-anchor > .jstree-undetermined { + background-position: -192px 0px; +} +.jstree-proton-large .jstree-anchor > .jstree-undetermined:hover { + background-position: -192px -32px; +} +.jstree-proton-large > .jstree-striped { + background-size: auto 64px; +} +.jstree-proton-large.jstree-rtl .jstree-node { + background-size: 320px 96px; + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); + background-position: 100% 1px; + background-repeat: repeat-y; +} +.jstree-proton-large.jstree-rtl .jstree-last { + background: transparent; +} +.jstree-proton-large.jstree-rtl .jstree-open > .jstree-ocl { + background-position: -128px -32px; +} +.jstree-proton-large.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -96px -32px; +} +.jstree-proton-large.jstree-rtl .jstree-leaf > .jstree-ocl { + background-position: -64px -32px; +} +.jstree-proton-large.jstree-rtl > .jstree-no-dots .jstree-node, +.jstree-proton-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl { + background: transparent; +} +.jstree-proton-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl { + background-position: -32px -32px; +} +.jstree-proton-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl { + background-position: 0px -32px; +} +.jstree-proton-large .jstree-themeicon-custom { + background-color: transparent; + background-size: 320px 96px; + background-image: none; + background-position: 0 0; +} +.jstree-proton-large > .jstree-container-ul .jstree-loading > .jstree-ocl { + background: url("throbber.gif") center center no-repeat; +} +.jstree-proton-large .jstree-file { + background: url("32px.png") -96px -64px no-repeat; +} +.jstree-proton-large .jstree-folder { + background: url("32px.png") -256px 0px no-repeat; +} +.jstree-proton-large > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; +} +#jstree-dnd.jstree-proton-large { + line-height: 32px; + padding: 0 4px; +} +#jstree-dnd.jstree-proton-large .jstree-ok, +#jstree-dnd.jstree-proton-large .jstree-er { + background-size: 320px 96px; + background-image: url("32px.png"); + background-repeat: no-repeat; + background-color: transparent; +} +#jstree-dnd.jstree-proton-large i { + background: transparent; + width: 32px; + height: 32px; + line-height: 32px; +} +#jstree-dnd.jstree-proton-large .jstree-ok { + background-position: 0px -64px; +} +#jstree-dnd.jstree-proton-large .jstree-er { + background-position: -32px -64px; +} +.jstree-proton-large.jstree-rtl .jstree-node { + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); +} +.jstree-proton-large.jstree-rtl .jstree-last { + background: transparent; +} +@media (max-width: 768px) { + #jstree-dnd.jstree-dnd-responsive { + line-height: 30px; + font-weight: bold; + font-size: 1.1em; + text-shadow: 1px 1px white; + } + #jstree-dnd.jstree-dnd-responsive > i { + background: transparent; + width: 30px; + height: 30px; + } + #jstree-dnd.jstree-dnd-responsive > .jstree-ok { + background-image: url("30px.png"); + background-position: 0 -150px; + background-size: 90px 180px; + } + #jstree-dnd.jstree-dnd-responsive > .jstree-er { + background-image: url("30px.png"); + background-position: -30px -150px; + background-size: 90px 180px; + } + #jstree-marker.jstree-dnd-responsive { + border-left-width: 10px; + border-top-width: 10px; + border-bottom-width: 10px; + margin-top: -10px; + } +} +@media (max-width: 768px) { + .jstree-proton-responsive { + /* + .jstree-open > .jstree-ocl, + .jstree-closed > .jstree-ocl { + border-radius:20px; + background-color:white; + } + */ + } + .jstree-proton-responsive .jstree-container-ul { + overflow: hidden; + } + .jstree-proton-responsive .jstree-icon { + background-image: url("30px.png"); + background-size: 90px 180px; + } + .jstree-proton-responsive .jstree-node, + .jstree-proton-responsive .jstree-leaf > .jstree-ocl { + background: transparent; + } + .jstree-proton-responsive .jstree-node { + min-height: 30px; + line-height: 30px; + margin-left: 30px; + min-width: 30px; + white-space: nowrap; + } + .jstree-proton-responsive .jstree-anchor { + line-height: 38px; + height: 38px; + margin: 0; + } + .jstree-proton-responsive .jstree-icon, + .jstree-proton-responsive .jstree-icon:empty { + margin-top: 4px; + width: 30px; + height: 30px; + line-height: 30px; + } + .jstree-proton-responsive > .jstree-container-ul > .jstree-node { + margin-left: 0; + } + .jstree-proton-responsive.jstree-rtl .jstree-node { + margin-left: 0; + margin-right: 30px; + } + .jstree-proton-responsive.jstree-rtl .jstree-container-ul > .jstree-node { + margin-right: 0; + } + .jstree-proton-responsive .jstree-ocl, + .jstree-proton-responsive .jstree-themeicon, + .jstree-proton-responsive .jstree-checkbox { + background-size: 90px 180px; + } + .jstree-proton-responsive .jstree-leaf > .jstree-ocl { + background: transparent; + } + .jstree-proton-responsive .jstree-open > .jstree-ocl { + background-position: 0 0px !important; + } + .jstree-proton-responsive .jstree-closed > .jstree-ocl { + background-position: 0 -30px !important; + } + .jstree-proton-responsive.jstree-rtl .jstree-closed > .jstree-ocl { + background-position: -30px 0px !important; + } + .jstree-proton-responsive .jstree-themeicon { + background-position: -30px -30px; + } + .jstree-proton-responsive .jstree-checkbox, + .jstree-proton-responsive .jstree-checkbox:hover { + background-position: -30px -60px; + } + .jstree-proton-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox, + .jstree-proton-responsive.jstree-checkbox-selection .jstree-clicked > .jstree-checkbox:hover, + .jstree-proton-responsive .jstree-checked > .jstree-checkbox, + .jstree-proton-responsive .jstree-checked > .jstree-checkbox:hover { + background-position: 0 -60px; + } + .jstree-proton-responsive .jstree-anchor > .jstree-undetermined, + .jstree-proton-responsive .jstree-anchor > .jstree-undetermined:hover { + background-position: 0 -90px; + } + .jstree-proton-responsive > .jstree-striped { + background: transparent; + } + .jstree-proton-responsive .jstree-wholerow-ul li { + position: relative; + } + .jstree-proton-responsive .jstree-wholerow-ul .jstree-wholerow { + position: absolute; + top: 0; + left: -1000px; + right: -1000px; + width: auto; + height: 100%; + } + .jstree-proton-responsive .jstree-wholerow { + border-top: 1px solid rgba(0, 0, 0, 0.05); + background: rgba(0, 0, 0, 0.02); + height: 30px; + } + .jstree-proton-responsive .jstree-wholerow-hovered { + background: #76b6ec; + } + .jstree-proton-responsive .jstree-wholerow-clicked { + background: #9d9d9d; + } + .jstree-proton-responsive .jstree-children .jstree-open + .jstree-open { + box-shadow: none; + } + .jstree-proton-responsive .jstree-node, + .jstree-proton-responsive .jstree-icon, + .jstree-proton-responsive .jstree-node > .jstree-ocl, + .jstree-proton-responsive .jstree-themeicon, + .jstree-proton-responsive .jstree-checkbox { + background-image: url("30px.png"); + background-size: 90px 180px; + } + .jstree-proton-responsive .jstree-node { + background-position: -60px 0; + background-repeat: repeat-y; + } + .jstree-proton-responsive .jstree-last { + background: transparent; + } + .jstree-proton-responsive .jstree-leaf > .jstree-ocl { + background-position: -30px -90px; + } + .jstree-proton-responsive .jstree-last > .jstree-ocl { + background-position: -30px -120px; + } + .jstree-proton-responsive .jstree-themeicon-custom { + background-color: transparent; + background-image: none; + background-position: 0 0; + } + .jstree-proton-responsive .jstree-file { + background: url("30px.png") 0 -120px no-repeat; + background-size: 90px 180px; + } + .jstree-proton-responsive .jstree-folder { + background: url("30px.png") -30px -30px no-repeat; + background-size: 90px 180px; + } + .jstree-proton-responsive > .jstree-container-ul > .jstree-node { + margin-left: 0; + margin-right: 0; + } +} +@font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-extralight-webfont.eot'); + src: url('fonts/titillium/titilliumweb-extralight-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/titillium/titilliumweb-extralight-webfont.woff') format('woff'), url('fonts/titillium/titilliumweb-extralight-webfont.ttf') format('truetype'), url('fonts/titillium/titilliumweb-extralight-webfont.svg#titillium_webthin') format('svg'); + font-weight: 300; + font-style: normal; +} +@font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-regular-webfont.eot'); + src: url('fonts/titillium/titilliumweb-regular-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/titillium/titilliumweb-regular-webfont.woff') format('woff'), url('fonts/titillium/titilliumweb-regular-webfont.ttf') format('truetype'), url('fonts/titillium/titilliumweb-regular-webfont.svg#titillium_webregular') format('svg'); + font-weight: 400; + font-style: normal; +} +@font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-bold-webfont.eot'); + src: url('fonts/titillium/titilliumweb-bold-webfont.eot?#iefix') format('embedded-opentype'), url('fonts/titillium/titilliumweb-bold-webfont.woff') format('woff'), url('fonts/titillium/titilliumweb-bold-webfont.ttf') format('truetype'), url('fonts/titillium/titilliumweb-bold-webfont.svg#titillium_webbold') format('svg'); + font-weight: 700; + font-style: normal; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + @font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-extralight-webfont.svg#titillium_webthin') format('svg'); + font-weight: 300; + font-style: normal; + } + @font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-regular-webfont.svg#titillium_webregular') format('svg'); + font-weight: 400; + font-style: normal; + } + @font-face { + font-family: 'Titillium Web'; + src: url('fonts/titillium/titilliumweb-bold-webfont.svg#titillium_webbold') format('svg'); + font-weight: 700; + font-style: normal; + } +} +.jstree-proton { + font-family: 'Titillium Web', sans-serif, Arial, sans-serif; +} diff --git a/dms_field/static/lib/jsTree/themes/proton/throbber.gif b/dms_field/static/lib/jsTree/themes/proton/throbber.gif new file mode 100644 index 000000000..1b5b2fde4 Binary files /dev/null and b/dms_field/static/lib/jsTree/themes/proton/throbber.gif differ diff --git a/dms_field/static/src/utils/format_binary_size.esm.js b/dms_field/static/src/utils/format_binary_size.esm.js new file mode 100644 index 000000000..3bd68c247 --- /dev/null +++ b/dms_field/static/src/utils/format_binary_size.esm.js @@ -0,0 +1,16 @@ +import {formatFloat} from "@web/views/fields/formatters"; + +export function formatBinarySize(value) { + var thresh = 1000; + if (Math.abs(value) < thresh) { + return formatFloat(value) + " B"; + } + var units = ["KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; + var unit = -1; + var new_value = value; + do { + new_value /= thresh; + ++unit; + } while (Math.abs(new_value) >= thresh && unit < units.length - 1); + return formatFloat(new_value) + " " + units[unit]; +} diff --git a/dms_field/static/src/utils/mimetype.esm.js b/dms_field/static/src/utils/mimetype.esm.js new file mode 100644 index 000000000..cfefbd3ae --- /dev/null +++ b/dms_field/static/src/utils/mimetype.esm.js @@ -0,0 +1,79 @@ +var mapping = [ + ["file-image-o", /^image\//], + ["file-audio-o", /^audio\//], + ["file-video-o", /^video\//], + ["file-pdf-o", "application/pdf"], + ["file-text-o", "text/plain"], + ["file-code-o", ["text/html", "text/javascript", "application/javascript"]], + [ + "file-archive-o", + [ + /^application\/x-(g?tar|xz|compress|bzip2|g?zip)$/, + /^application\/x-(7z|rar|zip)-compressed$/, + /^application\/(zip|gzip|tar)$/, + ], + ], + [ + "file-word-o", + [ + /ms-?word/, + "application/vnd.oasis.opendocument.text", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ], + ], + [ + "file-powerpoint-o", + [ + /ms-?powerpoint/, + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + ], + ], + [ + "file-excel-o", + [ + /ms-?excel/, + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + ], + ], + ["file-o"], +]; + +function match(mimetype, cond) { + if (Array.isArray(cond)) { + return cond.reduce(function (v, c) { + return v || match(mimetype, c); + }, false); + } else if (cond instanceof RegExp) { + return cond.test(mimetype); + } else if (cond === undefined) { + return true; + } + return mimetype === cond; +} + +var cache = {}; +function resolve(mimetype) { + if (cache[mimetype]) { + return cache[mimetype]; + } + for (var i = 0; i < mapping.length; i++) { + if (match(mimetype, mapping[i][1])) { + cache[mimetype] = mapping[i][0]; + return mapping[i][0]; + } + } +} + +export function mimetype2fa(mimetype, options) { + if (typeof mimetype === "object") { + var new_options = mimetype; + return function (new_mimetype) { + return mimetype2fa(new_mimetype, new_options); + }; + } + var icon = resolve(mimetype); + if (icon && options && options.prefix) { + return options.prefix + icon; + } + return icon; +} diff --git a/dms_field/static/src/views/dms_list/dms_list.scss b/dms_field/static/src/views/dms_list/dms_list.scss new file mode 100644 index 000000000..1a0ed6f75 --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list.scss @@ -0,0 +1,16 @@ +// This code is necessary to avoid an incompatibility with the definition +// .o_field_widget input, .o_field_widget textarea {color: inherit} added by +// web_responsive. This causes the text to appear white when editing the name of +// the selected file/directory on field mode (Example: field added on hr.employee by +// hr_dms_field), making it impossible to see the content. It is necessary to maintain +// it in version 16.0, and if migrating to higher versions, check if it remains +// necessary. +.jstree-proton .jstree-clicked { + color: #000000 !important; + i { + color: #ffffff; + } +} +.jstree-proton a.jstree-clicked { + color: #ffffff !important; +} diff --git a/dms_field/static/src/views/dms_list/dms_list_arch_parser.esm.js b/dms_field/static/src/views/dms_list/dms_list_arch_parser.esm.js new file mode 100644 index 000000000..1ff4859ac --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list_arch_parser.esm.js @@ -0,0 +1,31 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {Field} from "@web/views/fields/field"; +import {visitXML} from "@web/core/utils/xml"; + +export class DmsListArchParser { + parseFieldNode(node, models, modelName) { + return Field.parseFieldNode(node, models, modelName, "dms_list"); + } + + parse(xmlDoc, models, modelName) { + const fieldNodes = {}; + const fieldNextIds = {}; + visitXML(xmlDoc, (node) => { + if (node.tagName === "field") { + const fieldInfo = this.parseFieldNode(node, models, modelName); + if (!(fieldInfo.name in fieldNextIds)) { + fieldNextIds[fieldInfo.name] = 0; + } + const fieldId = `${fieldInfo.name}_${fieldNextIds[fieldInfo.name]++}`; + fieldNodes[fieldId] = fieldInfo; + node.setAttribute("field_id", fieldId); + return false; + } + }); + return { + fieldNodes, + xmlDoc, + }; + } +} diff --git a/dms_field/static/src/views/dms_list/dms_list_controller.esm.js b/dms_field/static/src/views/dms_list/dms_list_controller.esm.js new file mode 100644 index 000000000..cf2544292 --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list_controller.esm.js @@ -0,0 +1,536 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ + +import {Component, onRendered} from "@odoo/owl"; +import {Deferred} from "@web/core/utils/concurrency"; +import {Domain} from "@web/core/domain"; +import {Layout} from "@web/search/layout"; +import {extractFieldsFromArchInfo} from "@web/model/relational_model/utils"; +import {formatBinarySize} from "../../utils/format_binary_size.esm"; +import {mimetype2fa} from "../../utils/mimetype.esm"; +import {patch} from "@web/core/utils/patch"; +import {session} from "@web/session"; +import {useModelWithSampleData} from "@web/model/model"; +import {useService} from "@web/core/utils/hooks"; + +export function getDMSListControllerObject() { + return { + setup() { + super.setup(...arguments); + this.orm = useService("orm"); + this.actionService = useService("action"); + this.http = useService("http"); + this.duplicateId = false; + this.model = + (this.props.record && this.props.record.model) || + useModelWithSampleData(this.props.Model, this.modelParams()); + this.resModel = this.props.resModel || this.props.record.resModel; + this.rendererActions = { + onDMSCreateEmptyStorages: this.onDMSCreateEmptyStorages.bind(this), + onDMSLoad: this.onDMSLoad.bind(this), + onDMSRenameNode: this.onDMSRenameNode.bind(this), + onDMSMoveNode: this.onDMSMoveNode.bind(this), + onDMSDeleteNode: this.onDMSDeleteNode.bind(this), + onDMSDroppedFile: this.onDMSDroppedFile.bind(this), + }; + onRendered(() => { + this.processProps(); + }); + }, + modelParams() { + const {activeFields, fields} = extractFieldsFromArchInfo( + this.props.archInfo, + this.props.fields + ); + const modelConfig = this.props.state?.modelState?.config || { + resModel: this.props.resModel, + fields, + activeFields, + }; + return { + config: modelConfig, + state: this.props.state?.modelState, + }; + }, + sanitizeDMSModel(model) { + return model; + }, + processProps() { + const model = this.sanitizeDMSModel(this.resModel); + var storage_domain = []; + var directory_domain = []; + var autocompute_directory = false; + var show_storage = true; + if (model === "dms.storage") { + if (this.model.root.resId) { + storage_domain = [["id", "=", this.model.root.resId]]; + } else { + storage_domain = [ + [ + "id", + "in", + this.model.root.records.map((record) => { + return record.resId; + }), + ], + ]; + } + directory_domain = []; + } else if (model === "dms.field.template") { + if (this.model.root.resId) { + storage_domain = [["id", "=", this.model.root.data.storage_id[0]]]; + } else { + storage_domain = [["id", "=", 0]]; + } + directory_domain = [ + [ + "root_directory_id", + "in", + this.model.root.data.dms_directory_ids.records.map((record) => { + return record.resId; + }), + ], + ]; + } else { + storage_domain = [["field_template_ids.model", "=", model]]; + autocompute_directory = true; + show_storage = false; + } + this.params = { + storage: { + domain: storage_domain, + context: session.user_context, + show: show_storage, + }, + directory: { + domain: directory_domain, + context: session.user_context, + autocompute_directory: autocompute_directory, + }, + file: { + domain: [], + context: session.user_context, + show: true, + }, + }; + }, + async onDMSLoad(node) { + await this.model.root.load(); + this.model.notify(); + this.processProps(); + var args = this.buildDMSArgs(); + var result = false; + if (!node || node.id === "#") { + result = this.loadInitialData(args); + } else { + result = this.loadNode(node, args); + } + return {result, empty_storages: this.empty_storages}; + }, + loadInitialData(args) { + var self = this; + var data_loaded = new Deferred(); + this.empty_storages = []; + this.loadStorages(args).then((storages) => { + var loading_data_parts = []; + storages.forEach((storage, index) => { + if (storage.count_storage_directories > 0) { + const directory_loaded = new Deferred(); + loading_data_parts.push(directory_loaded); + this.loadDirectoriesSingle(storage.id, args).then( + (directories) => { + if (directories.length > 0) { + storages[index].directories = directories; + } else if ( + self.props.resModel !== "dms.directory" && + self.props.resModel !== "dms.storage" + ) { + self.empty_storages.push(storage); + } + directory_loaded.resolve(); + } + ); + } else if ( + self.props.resModel !== "dms.directory" && + self.props.resModel !== "dms.storage" + ) { + self.empty_storages.push(storage); + } + }); + Promise.all(loading_data_parts).then(() => { + if (args.storage.show) { + const result = storages + .map((storage) => { + if (!storage.directories) return undefined; + + const children = (storage.directories || []).map( + (directory) => + this.makeNodeDirectory( + directory, + args.file.show + ) + ); + + return this.makeNodeStorage(storage, children); + }) + .filter((node) => node !== undefined); + + data_loaded.resolve(result); + } else { + const nodes = []; + + storages.forEach((storage) => { + (storage.directories || []).forEach((directory) => { + nodes.push( + this.makeNodeDirectory( + directory, + args.file.show, + storage + ) + ); + }); + }); + + data_loaded.resolve(nodes); + } + }); + }); + return data_loaded; + }, + loadNode(node, args) { + var result = new Deferred(); + if (node.data && node.data.resModel === "dms.storage") { + this.loadDirectoriesSingle(node.data.data.id, args).then( + function (directories) { + var directory_nodes = directories.map((directory) => + this.makeNodeDirectory(directory, args.file.show) + ); + result.resolve(directory_nodes); + }.bind(this) + ); + } else if (node.data && node.data.resModel === "dms.directory") { + var files_loaded = new Deferred(); + var directories_loaded = new Deferred(); + this.loadSubdirectoriesSingle(node.data.data.id, args).then( + function (directories) { + var directory_nodes = directories.map((directory) => + this.makeNodeDirectory(directory, args.file.show) + ); + directories_loaded.resolve(directory_nodes); + }.bind(this) + ); + if (args.file.show) { + this.loadFilesSingle(node.data.data.id, args).then( + function (files) { + var file_nodes = files.map((file) => + this.makeNodeFile(file) + ); + files_loaded.resolve(file_nodes); + }.bind(this) + ); + } else { + files_loaded.resolve([]); + } + Promise.all([directories_loaded, files_loaded]).then( + ([directories, files]) => { + result.resolve(directories.concat(files)); + } + ); + } else { + result.resolve([]); + } + return result; + }, + makeNodeDirectory(directory, showFiles, storage) { + var data = Object.assign(directory, { + name: directory.name, + perm_read: directory.permission_read, + perm_create: directory.permission_create, + perm_write: directory.permission_write, + perm_unlink: directory.permission_unlink, + icon_url: directory.icon_url, + count_total_directories: directory.count_total_directories, + count_total_files: directory.count_total_files, + human_size: directory.human_size, + count_elements: directory.count_elements, + }); + if ( + storage && + this.resModel !== "dms.directory" && + this.resModel !== "dms.storage" + ) { + // We are assuming this is a record directory, so disabling actions + data.name = storage.name; + data.storage = true; + } + var dt = { + data: data, + resModel: "dms.directory", + }; + dt.parent = directory.parent_id + ? "directory_" + directory.parent_id[0] + : "#"; + var directoryNode = { + id: dt.id, + text: directory.name, + icon: "fa fa-folder-o", + type: "directory", + data: dt, + }; + if (showFiles) { + directoryNode.children = + directory.count_directories + directory.count_files > 0; + } else { + directoryNode.children = directory.count_directories > 0; + } + return directoryNode; + }, + makeNodeFile(file) { + var data = { + ...file, + filename: file.name, + display_name: file.name, + binary_size: formatBinarySize(file.size), + perm_read: file.permission_read, + perm_create: + file.permission_create && (!file.is_locked || file.is_lock_editor), + perm_write: + file.permission_write && (!file.is_locked || file.is_lock_editor), + perm_unlink: + file.permission_unlink && (!file.is_locked || file.is_lock_editor), + icon_url: file.icon_url, + }; + var dt = { + data: data, + resModel: "dms.file", + }; + return { + id: dt.id, + text: dt.data.display_name, + icon: mimetype2fa(dt.data.mimetype, {prefix: "fa fa-"}), + type: "file", + data: dt, + }; + }, + makeNodeStorage(storage, children) { + var dt = { + data: storage, + resModel: "dms.storage", + }; + return { + id: "storage_" + storage.id, + text: storage.name, + icon: "fa fa-database", + type: "storage", + data: dt, + children: children, + }; + }, + loadDirectories(operator, value, args) { + return this.orm.call("dms.directory", "search_read_parents", [], { + fields: [ + ...new Set([ + ...(args.directory.fields || []), + "permission_read", + "permission_create", + "permission_write", + "permission_unlink", + "count_directories", + "count_files", + "name", + "parent_id", + "icon_url", + "count_total_directories", + "count_total_files", + "human_size", + "count_elements", + "write_date", + ]), + ], + domain: this.buildDMSDomain( + [["storage_id", operator, value]], + args.directory.domain, + args.directory.autocompute_directory + ), + context: args.directory.context || session.user_context, + }); + }, + loadDirectoriesSingle(storage_id, args) { + return this.loadDirectories("=", storage_id, args); + }, + loadSubdirectories(operator, value, args) { + const domain = this.buildDMSDomain( + [["parent_id", operator, value]], + args.directory.domain, + false + ); + const fields = [ + ...new Set([ + ...(args.directory.fields || []), + "permission_read", + "permission_create", + "permission_write", + "permission_unlink", + "count_directories", + "count_files", + "name", + "parent_id", + "icon_url", + "count_total_directories", + "count_total_files", + "human_size", + "count_elements", + "write_date", + ]), + ]; + return this.orm.searchRead("dms.directory", domain, fields, { + context: args.file.context || session.user_context, + }); + }, + loadSubdirectoriesSingle(directory_id, args) { + return this.loadSubdirectories("=", directory_id, args); + }, + loadFiles(operator, value, args) { + const domain = this.buildDMSDomain( + [["directory_id", operator, value]], + args.file.domain + ); + const fields = [ + ...new Set([ + ...(args.file.fields || []), + "permission_read", + "permission_create", + "permission_write", + "permission_unlink", + "icon_url", + "name", + "mimetype", + "directory_id", + "human_size", + "is_locked", + "is_lock_editor", + "extension", + "write_date", + ]), + ]; + return this.orm.searchRead("dms.file", domain, fields, { + context: args.file.context || session.user_context, + }); + }, + loadFilesSingle(directory_id, args) { + return this.loadFiles("=", directory_id, args); + }, + loadStorages(args) { + const fields = [ + ...new Set([ + ...(args.storage.fields || []), + "name", + "count_storage_directories", + ]), + ]; + return this.orm.searchRead( + "dms.storage", + args.storage.domain || [], + fields, + { + context: args.storage.context || session.user_context, + } + ); + }, + buildDMSDomain(base, domain, autocompute_directory) { + var result = new Domain(base); + if (autocompute_directory) { + result = Domain.and([ + result, + new Domain([["res_id", "=", this.model.root.resId]]), + ]); + } else { + result = Domain.and([result, new Domain(domain || [])]); + } + return result.toList(); + }, + buildDMSArgs() { + return { + ...this.params, + search: { + operator: "ilike", + }, + }; + }, + onDMSCreateEmptyStorages() { + var data = { + model: this.sanitizeDMSModel(this.resModel), + empty_storages: this.empty_storages, + res_id: this.props.record.resId, + }; + return this.orm.call("dms.field.template", "create_dms_directory", [], { + context: { + res_id: data.res_id, + res_model: data.model, + }, + }); + }, + onDMSRenameNode(node, text) { + node.data.data.name = text; + return this.orm.write(node.data.resModel, [node.data.data.id], { + name: text, + }); + }, + onDMSMoveNode(node, newParent) { + var data = {}; + if (node.data.resModel === "dms.file") { + data.directory_id = newParent.data.data.id; + } else if (node.data.resModel === "dms.directory") { + data.parent_id = newParent.data.data.id; + } + return this.orm.write(node.data.resModel, [node.data.data.id], data); + }, + onDMSDeleteNode(node) { + return this.orm.unlink(node.data.resModel, [node.data.data.id]); + }, + async onDMSDroppedFile(directoryId, files) { + const params = { + csrf_token: odoo.csrf_token, + ufile: [...files], + model: "dms.file", + id: 0, + }; + const fileData = await this.http.post( + "/web/binary/upload_attachment", + params, + "text" + ); + const attachments = JSON.parse(fileData); + if (attachments.error) { + throw new Error(attachments.error); + } + const attachmentIds = attachments.map((a) => a.id); + if (!attachmentIds.length) { + return "no_attachments"; + } + const attachment_datas = await this.orm.call( + "dms.file", + "get_dms_files_from_attachments", + [], + { + attachment_ids: attachmentIds, + } + ); + const attachments_args = []; + attachment_datas.forEach((attachment_data) => { + attachments_args.push({ + name: attachment_data.name, + content: attachment_data.datas, + mimetype: attachment_data.mimetype, + directory_id: directoryId, + }); + }); + return this.orm.call("dms.file", "create", [attachments_args]); + }, + }; +} + +export class DmsListController extends Component {} +patch(DmsListController.prototype, getDMSListControllerObject()); +DmsListController.template = "dms_field.View"; +DmsListController.components = {Layout}; diff --git a/dms_field/static/src/views/dms_list/dms_list_controller.xml b/dms_field/static/src/views/dms_list/dms_list_controller.xml new file mode 100644 index 000000000..34e580699 --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list_controller.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js b/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js new file mode 100644 index 000000000..9ff909d93 --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list_renderer.esm.js @@ -0,0 +1,551 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import { + Component, + onMounted, + onWillStart, + useEffect, + useRef, + useState, +} from "@odoo/owl"; +import {loadBundle, loadCSS, loadJS} from "@web/core/assets"; +import {FormViewDialog} from "@web/views/view_dialogs/form_view_dialog"; +import {_t} from "@web/core/l10n/translation"; +import {download} from "@web/core/network/download"; +import {useFileViewer} from "@web/core/file_viewer/file_viewer_hook"; +import {useService} from "@web/core/utils/hooks"; + +export class DmsListRenderer extends Component { + setup() { + this.js_tree = useRef("jstree"); + this.extra_actions = useRef("extra_actions"); + this.dms_add_directory = useRef("dms_add_directory"); + this.nodeSelectedState = useState({data: {}}); + this.store = useService("mail.store"); + this.fileViewer = useFileViewer(); + this.notification = useService("notification"); + this.dialog = useService("dialog"); + this.dragState = useState({ + showDragZone: false, + }); + this.dropZone = useRef("dropZone"); + + useEffect( + (el) => { + if (!el) { + return; + } + const highlight = this.highlight.bind(this); + const unhighlight = this.unhighlight.bind(this); + const drop = this.onDrop.bind(this); + el.addEventListener("dragover", highlight); + el.addEventListener("dragleave", unhighlight); + el.addEventListener("drop", drop); + return () => { + el.removeEventListener("dragover", highlight); + el.removeEventListener("dragleave", unhighlight); + el.removeEventListener("drop", drop); + }; + }, + + () => [this.dropZone.el] + ); + onWillStart(async () => { + await loadBundle("web._assets_jquery"); + await loadJS("/dms_field/static/lib/jsTree/jstree.js"); + await loadCSS("/dms_field/static/lib/jsTree/themes/proton/style.css"); + this.config = this.buildTreeConfig(); + // When loading jQuery, we need to assign it to this.$ in + // order to use it within the component, and it is loaded in + // the window object. Without excluding it from no-undef, + // we would get a linter error, but in this case, it’s not + // worth excluding it from the globals. + + this.$ = window.jQuery; + }); + onMounted(() => { + this.$tree = this.$(this.js_tree.el); + }); + useEffect( + () => { + this.nodeSelectedState.data = {}; + this.updatePreview({}); + this.$tree.jstree("destroy"); + this.config = this.buildTreeConfig(); + this.$tree.jstree(this.config); + this.startTreeTriggers(); + }, + () => [this.props.record] + ); + } + buildTreeConfig() { + var plugins = [ + "conditionalselect", + "massload", + "wholerow", + "state", + "sort", + "search", + "types", + "contextmenu", + ]; + return { + core: { + widget: this, + animation: 0, + multiple: false, + check_callback: this.checkCallback.bind(this), + themes: { + name: "proton", + responsive: true, + }, + data: this.loadData.bind(this), + }, + contextmenu: { + items: this.loadContextMenu.bind(this), + }, + state: { + key: "documents", + }, + conditionalselect: this.checkSelect.bind(this), + plugins: plugins, + sort: function (a, b) { + // Correctly sort the records according to the type of element + // (folder or file). + // Do not use node.icon because they may have (or will have) a + // different icon for each file according to its extension. + var node_a = this.get_node(a); + var node_b = this.get_node(b); + if (node_a.data.resModel === node_b.data.resModel) { + return node_a.text > node_b.text ? 1 : -1; + } + return node_a.data.resModel > node_b.data.resModel ? 1 : -1; + }, + }; + } + startTreeTriggers() { + this.$tree.on("open_node.jstree", (e, data) => { + if (data.node.data && data.node.data.resModel === "dms.directory") { + data.instance.set_icon(data.node, "fa fa-folder-open-o"); + } + }); + this.$tree.on("close_node.jstree", (e, data) => { + if (data.node.data && data.node.data.resModel === "dms.directory") { + data.instance.set_icon(data.node, "fa fa-folder-o"); + } + }); + this.$tree.on("changed.jstree", (e, data) => { + this.treeChanged(data); + }); + this.$tree.on("move_node.jstree", (e, data) => { + var jstree = this.$tree.jstree(true); + this.props.rendererActions.onDMSMoveNode( + data.node, + jstree.get_node(data.parent) + ); + }); + this.$tree.on("rename_node.jstree", (e, data) => { + this.props.rendererActions.onDMSRenameNode(data.node, data.text); + this.updatePreview(data.node); + }); + this.$tree.on("delete_node.jstree", (e, data) => { + this.props.rendererActions.onDMSDeleteNode(data.node); + }); + this.$tree.on("loaded.jstree", () => { + this.$tree.jstree("open_all"); + }); + } + + treeChanged(data) { + if ( + data.action === "select_node" && + data.selected && + data.selected.length === 1 + ) { + this.updatePreview(data.node); + } + } + + updatePreview(node) { + var $buttons = this.$(this.extra_actions.el); + $buttons.empty(); + if ( + node.data && + ["dms.directory", "dms.file"].indexOf(node.data.resModel) !== -1 + ) { + this.nodeSelectedState.data = {}; + this.nodeSelectedState.data = node.data; + var menu = this.loadContextMenu(node); + Object.entries(menu).forEach(([, action]) => { + this.generateActionButton(node, action, $buttons); + }); + } + } + + loadContextMenu(node) { + var menu = {}; + var jstree = this.$tree.jstree(true); + if (node.data) { + if (node.data.resModel === "dms.directory") { + menu = this.loadContextMenuDirectoryBefore(jstree, node, menu); + menu = this.loadContextMenuBasic(jstree, node, menu); + menu = this.loadContextMenuDirectory(jstree, node, menu); + } else if (node.data.resModel === "dms.file") { + menu = this.loadContextMenuBasic(jstree, node, menu); + menu = this.loadContextMenuFile(jstree, node, menu); + } + } + return menu; + } + + loadContextMenuBasic($jstree, node, menu) { + menu.rename = { + separator_before: false, + separator_after: false, + icon: "fa fa-pencil", + label: _t("Rename"), + action: () => { + $jstree.edit(node); + }, + _disabled: () => { + return !node.data.data.perm_write || node.data.data.storage; + }, + }; + menu.action = { + separator_before: false, + separator_after: false, + icon: "fa fa-bolt", + label: _t("Actions"), + action: false, + submenu: { + cut: { + separator_before: false, + separator_after: false, + icon: "fa fa-scissors", + label: _t("Cut"), + action: () => { + $jstree.cut(node); + }, + _disabled: () => { + return !node.data.data.perm_read || node.data.data.storage; + }, + }, + }, + _disabled: () => { + return !node.data.data.perm_read; + }, + }; + menu.delete = { + separator_before: false, + separator_after: false, + icon: "fa fa-trash-o", + label: _t("Delete"), + action: () => { + $jstree.delete_node(node); + }, + _disabled: () => { + return !node.data.data.perm_unlink || node.data.data.storage; + }, + }; + menu.open = { + separator_before: false, + separator_after: false, + icon: "fa fa-external-link", + label: _t("Open"), + action: () => { + this.onDMSOpenRecord(node); + }, + }; + return menu; + } + + loadContextMenuDirectoryBefore($jstree, node, menu) { + menu.add_directory = { + separator_before: false, + separator_after: false, + icon: "fa fa-folder", + label: _t("Create directory"), + action: () => { + this.onDMSAddDirectory(node); + }, + _disabled: () => { + return !node.data.data.perm_create; + }, + }; + menu.add_file = { + separator_before: false, + separator_after: true, + icon: "fa fa-file", + label: _t("Create File"), + action: () => { + this.onDMSAddFile(node); + }, + _disabled: () => { + return !node.data.data.perm_create; + }, + }; + return menu; + } + + loadContextMenuDirectory($jstree, node, menu) { + if (menu.action && menu.action.submenu) { + menu.action.submenu.paste = { + separator_before: false, + separator_after: false, + icon: "fa fa-clipboard", + label: _t("Paste"), + action: () => { + $jstree.paste(node); + }, + _disabled: () => { + return !$jstree.can_paste() && !node.data.data.perm_create; + }, + }; + } + return menu; + } + + loadContextMenuFile($jstree, node, menu) { + menu.preview = { + separator_before: false, + separator_after: false, + icon: "fa fa-eye", + label: _t("Preview"), + action: () => { + this.onDMSPreviewFile(node); + }, + }; + menu.download = { + separator_before: false, + separator_after: false, + icon: "fa fa-download", + label: _t("Download"), + action: () => { + download({ + url: "/web/content", + data: { + id: node.data.data.id, + download: true, + field: "content", + model: "dms.file", + filename_field: "name", + filename: node.data.data.filename, + }, + }); + }, + }; + return menu; + } + + generateActionButton(node, action, $buttons) { + if (action.action) { + var $button = this.$(" + + + + + + diff --git a/dms_field/static/src/views/dms_list/dms_list_view.esm.js b/dms_field/static/src/views/dms_list/dms_list_view.esm.js new file mode 100644 index 000000000..4c33931dd --- /dev/null +++ b/dms_field/static/src/views/dms_list/dms_list_view.esm.js @@ -0,0 +1,31 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {DmsListArchParser} from "./dms_list_arch_parser.esm"; +import {DmsListController} from "./dms_list_controller.esm"; +import {DmsListRenderer} from "./dms_list_renderer.esm"; +import {RelationalModel} from "@web/model/relational_model/relational_model"; +import {registry} from "@web/core/registry"; + +export const dmsListView = { + type: "dms_list", + + Controller: DmsListController, + ArchParser: DmsListArchParser, + Renderer: DmsListRenderer, + Model: RelationalModel, + + props(genericProps, view) { + const {ArchParser} = view; + const {arch, relatedModels, resModel} = genericProps; + const archInfo = new ArchParser().parse(arch, relatedModels, resModel); + + return { + ...genericProps, + Model: view.Model, + Renderer: view.Renderer, + archInfo, + }; + }, +}; + +registry.category("views").add("dms_list", dmsListView); diff --git a/dms_field/static/src/views/fields/x2many/x2many_field.esm.js b/dms_field/static/src/views/fields/x2many/x2many_field.esm.js new file mode 100644 index 000000000..b1ace8b2d --- /dev/null +++ b/dms_field/static/src/views/fields/x2many/x2many_field.esm.js @@ -0,0 +1,25 @@ +/* Copyright 2024 Tecnativa - Carlos Roca + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {DmsListRenderer} from "../../dms_list/dms_list_renderer.esm"; +import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; +import {getDMSListControllerObject} from "../../dms_list/dms_list_controller.esm"; +import {patch} from "@web/core/utils/patch"; + +patch(X2ManyField.prototype, getDMSListControllerObject()); +patch(X2ManyField.prototype, { + get rendererProps() { + const props = { + archInfo: this.archInfo, + list: this.list, + openRecord: this.openRecord.bind(this), + }; + if (this.props.viewMode === "dms_list") { + props.readonly = this.props.readonly; + props.rendererActions = this.rendererActions; + props.record = this.props.record; + return props; + } + return super.rendererProps; + }, +}); +X2ManyField.components = {...X2ManyField.components, DmsListRenderer}; diff --git a/dms_field/static/src/views/fields/x2many/x2many_field.xml b/dms_field/static/src/views/fields/x2many/x2many_field.xml new file mode 100644 index 000000000..cfb9a5bfe --- /dev/null +++ b/dms_field/static/src/views/fields/x2many/x2many_field.xml @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/dms_field/tests/__init__.py b/dms_field/tests/__init__.py new file mode 100644 index 000000000..d0f06869d --- /dev/null +++ b/dms_field/tests/__init__.py @@ -0,0 +1 @@ +from . import test_dms_field diff --git a/dms_field/tests/test_dms_field.py b/dms_field/tests/test_dms_field.py new file mode 100644 index 000000000..1d4cc956d --- /dev/null +++ b/dms_field/tests/test_dms_field.py @@ -0,0 +1,280 @@ +# Copyright 2020 Creu Blanca +# Copyright 2024 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import fields +from odoo.exceptions import UserError, ValidationError +from odoo.tests import new_test_user +from odoo.tools import mute_logger + +from odoo.addons.base.tests.common import BaseCommon + + +class TestDmsField(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, test_dms_field=True)) + cls.user_a = new_test_user(cls.env, login="test-user-a") + cls.group = cls.env["res.groups"].create( + {"name": "Test group", "users": [(4, cls.user_a.id)]} + ) + cls.user_b = new_test_user(cls.env, login="test-user-b") + cls.template = cls.env.ref("dms_field.field_template_partner") + cls.template.group_ids.group_ids = [(4, cls.group.id)] + cls.template.group_ids.explicit_user_ids = [(4, cls.user_b.id)] + cls.storage = cls.template.storage_id + cls.directory = cls.template.dms_directory_ids + cls.subdirectory_1 = cls.env["dms.directory"].create( + { + "name": "Test subdirectory 1", + "parent_id": cls.directory.id, + "storage_id": cls.storage.id, + } + ) + cls.subdirectory_2 = cls.env["dms.directory"].create( + { + "name": "Test subdirectory 2", + "parent_id": cls.directory.id, + "storage_id": cls.storage.id, + } + ) + cls.partner = ( + cls.env["res.partner"] + .with_context(skip_track_dms_field_template=True) + .create({"name": "DEMO Partner"}) + ) + + def _create_directory_vals(self, record): + return { + "storage_id": self.storage.id, + "is_root_directory": True, + "name": record.display_name, + "res_model": record._name, + "res_id": record.id, + } + + def test_check_constrain_multi_directory(self): + self.env["dms.directory"].create(self._create_directory_vals(self.partner)) + with self.assertRaises(ValidationError): + self.env["dms.directory"].create(self._create_directory_vals(self.partner)) + + def test_check_constrain_not_root(self): + directory = self.env["dms.directory"].create( + self._create_directory_vals(self.partner) + ) + with self.assertRaises(ValidationError): + self.env["dms.directory"].create( + { + "parent_id": directory.id, + "name": "Second Directory", + "res_model": self.partner._name, + "res_id": self.partner.id, + } + ) + + def test_js_tree(self): + self.assertTrue( + any( + r["id"] == f"storage_{self.storage.id}" + for r in self.storage.get_js_tree_data() + ) + ) + + def test_dms_access_group_constrains_dms_field_ref(self): + group = self.env["dms.access.group"].create( + { + "name": "Test 1", + "dms_field_ref": f"{self.partner._name},{self.partner.id}", + } + ) + with self.assertRaises(UserError): + group.copy({"name": "Test 2"}) + + def test_dms_access_group_company_dms_field_ref_01(self): + self.partner.company_id = False + group = self.env["dms.access.group"].create( + { + "name": "Test 1", + "dms_field_ref": f"{self.partner._name},{self.partner.id}", + } + ) + self.assertFalse(group.company_id) + + def test_dms_access_group_company_dms_field_ref_02(self): + self.company = self.env.company + self.partner.company_id = self.company + group = self.env["dms.access.group"].create( + { + "name": "Test 1", + "dms_field_ref": f"{self.partner._name},{self.partner.id}", + } + ) + self.assertEqual(group.company_id, self.company) + + def test_template_directory(self): + self.assertTrue(self.template.dms_directory_ids) + self.assertIn( + self.template.group_ids, self.template.dms_directory_ids.group_ids + ) + + @mute_logger("odoo.models.unlink") + def test_creation_process_01(self): + self.assertFalse(self.partner.dms_directory_ids) + template = self.env["dms.field.template"].with_context( + res_model=self.partner._name, res_id=self.partner.id + ) + template.create_dms_directory() + self.partner.invalidate_model() + self.assertEqual(self.partner.dms_directory_ids.name, self.partner.display_name) + child_names = self.partner.dms_directory_ids.mapped("child_directory_ids.name") + directory_0 = self.partner.dms_directory_ids[0] + self.assertFalse(directory_0.parent_id) + self.assertTrue(directory_0.is_root_directory) + self.assertTrue(directory_0.inherit_group_ids) + self.assertIn(self.template.group_ids, directory_0.group_ids) + self.assertIn(self.group, directory_0.group_ids.group_ids) + self.assertIn(self.partner, directory_0.mapped("group_ids.dms_field_ref")) + group_custom = directory_0.group_ids.filtered("dms_field_ref") + self.assertTrue(group_custom.perm_create) + self.assertTrue(group_custom.perm_write) + self.assertTrue(group_custom.perm_unlink) + self.assertIn(self.user_b, directory_0.group_ids.explicit_user_ids) + self.assertIn(self.user_a, directory_0.group_ids.users) + self.assertIn(self.user_b, directory_0.group_ids.users) + self.assertIn(self.subdirectory_1.name, child_names) + self.assertIn(self.subdirectory_2.name, child_names) + with self.assertRaises(ValidationError): + template.create_dms_directory() + # Remove folder: El grupo de acceso todavía existe + old_groups = directory_0.group_ids + directory_0.unlink() + dms_field_ref_value = f"{self.partner._name},{self.partner.id}" + total = self.env["dms.access.group"].search_count( + [("dms_field_ref", "=", dms_field_ref_value)] + ) + self.assertEqual(total, 1) + # Create directory again (access groups are the same) + template.create_dms_directory() + self.partner.invalidate_model() + directory_0 = self.partner.dms_directory_ids[0] + self.assertEqual(directory_0.group_ids, old_groups) + + def test_creation_process_01_with_parent(self): + self.assertFalse(self.partner.dms_directory_ids) + self.template.parent_directory_id = fields.first( + self.template.storage_id.root_directory_ids + ) + template = self.env["dms.field.template"].with_context( + res_model=self.partner._name, res_id=self.partner.id + ) + template.create_dms_directory() + self.partner.invalidate_model() + self.assertEqual(self.partner.dms_directory_ids.name, self.partner.display_name) + directory_0 = self.partner.dms_directory_ids[0] + self.assertEqual(directory_0.parent_id, self.template.parent_directory_id) + self.assertFalse(directory_0.is_root_directory) + self.assertFalse(directory_0.inherit_group_ids) + self.assertIn(self.template.group_ids, directory_0.group_ids) + self.assertIn(self.group, directory_0.group_ids.group_ids) + self.assertIn(self.user_b, directory_0.group_ids.explicit_user_ids) + self.assertIn(self.user_a, directory_0.group_ids.users) + self.assertIn(self.user_b, directory_0.group_ids.users) + + def test_creation_process_02(self): + partner_1 = self.env["res.partner"].create({"name": "Test partner 1"}) + partner_1.invalidate_model() + directory_1 = partner_1.dms_directory_ids[0] + self.assertFalse(directory_1.parent_id) + self.assertTrue(directory_1.is_root_directory) + self.assertTrue(directory_1.inherit_group_ids) + partner_2 = ( + self.env["res.partner"] + .with_context(skip_track_dms_field_template=True) + .create({"name": "Test partner 2"}) + ) + partner_2.invalidate_model() + self.assertFalse(partner_2.dms_directory_ids) + + def test_creation_process_02_with_parent(self): + self.template.parent_directory_id = fields.first( + self.template.storage_id.root_directory_ids + ) + partner_1 = self.env["res.partner"].create({"name": "Test partner 1"}) + partner_1.invalidate_model() + directory_1 = partner_1.dms_directory_ids[0] + self.assertEqual(directory_1.parent_id, self.template.parent_directory_id) + self.assertFalse(directory_1.is_root_directory) + self.assertFalse(directory_1.inherit_group_ids) + partner_2 = ( + self.env["res.partner"] + .with_context(skip_track_dms_field_template=True) + .create({"name": "Test partner 2"}) + ) + partner_2.invalidate_model() + self.assertFalse(partner_2.dms_directory_ids) + + def test_creation_process_03(self): + self.template.directory_format_name = "{{object.name}}-{{object.ref}}" + partner_1 = self.env["res.partner"].create( + {"name": "TEST-PARTNER1", "ref": "CUSTOM-REF"} + ) + partner_1.invalidate_model() + self.assertEqual( + partner_1.dms_directory_ids.name, f"{partner_1.name}-{partner_1.ref}" + ) + + def test_parents(self): + directory = self.env["dms.directory"].create( + self._create_directory_vals(self.partner) + ) + self.assertEqual( + directory.search_read_parents([("id", "=", directory.id)], fields=["id"])[ + 0 + ], + {"id": directory.id}, + ) + self.assertEqual( + directory.search_read_parents( + [("id", "=", directory.id)], fields=["id", "name"] + )[0], + {"id": directory.id, "name": directory.name}, + ) + self.assertIn( + {"id": directory.id, "name": directory.name}, + directory.search_read_parents(fields=["id", "name"]), + ) + + def test_child_values(self): + """Values of the child directory in the template + are propagated to the new directories.""" + # Arrange + partner = self.partner + access_group = self.env["dms.access.group"].create( + { + "name": "Test Access group", + } + ) + child_dir = self.subdirectory_1 + child_dir.inherit_group_ids = False + child_dir.group_ids = access_group + + # Act + self.env["dms.field.template"].with_context( + res_model=partner._name, + res_id=partner.id, + ).create_dms_directory() + + # Assert + partner.invalidate_model() + new_subdirectory_1 = partner.dms_directory_ids.child_directory_ids.filtered( + lambda d, dir_name=child_dir.name: d.name == dir_name + ) + self.assertFalse(new_subdirectory_1.inherit_group_ids) + self.assertEqual(new_subdirectory_1.group_ids, access_group) + + new_subdirectory_2 = partner.dms_directory_ids.child_directory_ids.filtered( + lambda d, dir_name=self.subdirectory_2.name: d.name == dir_name + ) + self.assertTrue(new_subdirectory_2.inherit_group_ids) + self.assertIn(self.group, new_subdirectory_2.complete_group_ids.group_ids) diff --git a/dms_field/views/dms_access_group_views.xml b/dms_field/views/dms_access_group_views.xml new file mode 100644 index 000000000..f558cf874 --- /dev/null +++ b/dms_field/views/dms_access_group_views.xml @@ -0,0 +1,23 @@ + + + + dms_access_groups.tree + dms.access.group + + + + + + + + + dms_access.group.form + dms.access.group + + + + + + + + diff --git a/dms_field/views/dms_directory.xml b/dms_field/views/dms_directory.xml new file mode 100644 index 000000000..2e090c416 --- /dev/null +++ b/dms_field/views/dms_directory.xml @@ -0,0 +1,15 @@ + + + + + dms.directory.dms_tree (in dms_field) + dms.directory + dms_list + + + + + + + diff --git a/dms_field/views/dms_field_template_views.xml b/dms_field/views/dms_field_template_views.xml new file mode 100644 index 000000000..d0d6a0399 --- /dev/null +++ b/dms_field/views/dms_field_template_views.xml @@ -0,0 +1,69 @@ + + + + + dms.field.template + + + + + + + + + + + dms.field.template + +
      + +
      +

      + +

      +
      + + + + + + + + + + + + + + + +
      +
      +
      +
      + + Embedded DMS templates + dms.field.template + list,form + + +
      diff --git a/dms_field/views/dms_storage.xml b/dms_field/views/dms_storage.xml new file mode 100644 index 000000000..e39308c77 --- /dev/null +++ b/dms_field/views/dms_storage.xml @@ -0,0 +1,28 @@ + + + + + dms.storage.dms_tree (in dms_field) + dms.storage + dms_list + + + + + + + + Documents + dms.storage + dms_list + [] + {} + + + Documents + + + + + diff --git a/dms_field_auto_classification/README.rst b/dms_field_auto_classification/README.rst new file mode 100644 index 000000000..d1d298dc2 --- /dev/null +++ b/dms_field_auto_classification/README.rst @@ -0,0 +1,124 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +===================================== +Auto classify files into embedded DMS +===================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:d9cf2707013d67b046d8df2ad1ae7ce09eeaba4ebc5d41c5e3db01bedc6d74fb + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/dms_field_auto_classification + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-dms_field_auto_classification + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Automatically classify files within a .zip file to the corresponding +directory(s) related to an embedded DMS. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +1. Go to Documents / Configuration / Classification Templates and create + or edit a template. +2. You can set a model to which it is linked (res.partner for example). +3. You can define the details to indicate which field is referenced by + the defined filename pattern. + +Full example from res.partner: + +Filename pattern: ([0-9]{8}[A-Z]).\*.pdf Details: VAT (field) and 0 +(index) Directory Pattern example 1: {0} > This will attempt to add the +files to the directory linked to the partner with the VAT name. +Directory Pattern example 2: {0} / Misc > This will attempt to add the +files to the "Misc" subdirectory linked to the partner with the VAT +name. + +Usage +===== + +1. Go to Documents / Auto Classification and select a template and a + .zip file. +2. Press the Analyze button +3. As many lines will be set as the number of files contained in the + .zip file and apply the filename pattern. +4. The record to which they are related (res.partner for example) will + be show on the lines. +5. Press the Classify button +6. The files (dms.file) will be created in the corresponding + directories. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/dms_field_auto_classification/__init__.py b/dms_field_auto_classification/__init__.py new file mode 100644 index 000000000..e1e144406 --- /dev/null +++ b/dms_field_auto_classification/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models +from . import wizards diff --git a/dms_field_auto_classification/__manifest__.py b/dms_field_auto_classification/__manifest__.py new file mode 100644 index 000000000..4b01d40e0 --- /dev/null +++ b/dms_field_auto_classification/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Auto classify files into embedded DMS", + "version": "18.0.1.0.0", + "category": "Document Management", + "website": "https://github.com/OCA/dms", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["dms_auto_classification", "dms_field"], + "installable": True, + "data": [ + "security/ir.model.access.csv", + "views/dms_classification_template_views.xml", + "wizards/wizard_dms_classification_views.xml", + ], + "demo": ["demo/dms_classification_template_demo.xml"], + "maintainers": ["victoralmau"], +} diff --git a/dms_field_auto_classification/demo/dms_classification_template_demo.xml b/dms_field_auto_classification/demo/dms_classification_template_demo.xml new file mode 100644 index 000000000..261edd865 --- /dev/null +++ b/dms_field_auto_classification/demo/dms_classification_template_demo.xml @@ -0,0 +1,20 @@ + + + + Partners template + ([0-9]{8}[A-Z]).*.pdf + + {0} + + + + + 0 + + diff --git a/dms_field_auto_classification/i18n/dms_field_auto_classification.pot b/dms_field_auto_classification/i18n/dms_field_auto_classification.pot new file mode 100644 index 000000000..8e34de915 --- /dev/null +++ b/dms_field_auto_classification/i18n/dms_field_auto_classification.pot @@ -0,0 +1,105 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_date +msgid "Created on" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__detail_ids +msgid "Details" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template_detail +msgid "Dms Classification Template Detail" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__field_id +msgid "Field" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__id +msgid "ID" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__index +msgid "Index" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model_id +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__model_id +msgid "Model" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__parent_id +msgid "Parent" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__sequence +msgid "Sequence" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__template_id +msgid "Template" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "" diff --git a/dms_field_auto_classification/i18n/es.po b/dms_field_auto_classification/i18n/es.po new file mode 100644 index 000000000..ea735af09 --- /dev/null +++ b/dms_field_auto_classification/i18n/es.po @@ -0,0 +1,114 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-23 12:22+0000\n" +"PO-Revision-Date: 2024-03-23 09:34+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__detail_ids +msgid "Details" +msgstr "Detalles" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__display_name +msgid "Display Name" +msgstr "Nombre a Mostrar" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "Plantilla de clasificación Dms" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template_detail +msgid "Dms Classification Template Detail" +msgstr "Plantilla de Clasificación Dms Detalle" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__field_id +msgid "Field" +msgstr "Campo" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__id +msgid "ID" +msgstr "ID" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__index +msgid "Index" +msgstr "Índice" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_uid +msgid "Last Updated by" +msgstr "Actualizado por última vez por" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_date +msgid "Last Updated on" +msgstr "Última modificación el" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model_id +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__model_id +msgid "Model" +msgstr "Modelo" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__parent_id +msgid "Parent" +msgstr "Padre" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__record_ref +msgid "Record Referenced" +msgstr "Registro referenciado" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__sequence +msgid "Sequence" +msgstr "Secuencia" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__template_id +msgid "Template" +msgstr "Plantilla" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "Asistente de Clasificación Dms Detalle" diff --git a/dms_field_auto_classification/i18n/it.po b/dms_field_auto_classification/i18n/it.po new file mode 100644 index 000000000..64ca3fdf4 --- /dev/null +++ b/dms_field_auto_classification/i18n/it.po @@ -0,0 +1,113 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-10-03 10:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__detail_ids +msgid "Details" +msgstr "Dettagli" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "Modello classificazione DMS" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template_detail +msgid "Dms Classification Template Detail" +msgstr "Dettagli modello classificazione DMS" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__field_id +msgid "Field" +msgstr "Campo" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__id +msgid "ID" +msgstr "ID" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__index +msgid "Index" +msgstr "Indice" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model_id +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__model_id +msgid "Model" +msgstr "Modello" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model +msgid "Model name" +msgstr "Nome modello" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__parent_id +msgid "Parent" +msgstr "Padre" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__record_ref +msgid "Record Referenced" +msgstr "Record referenziato" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__sequence +msgid "Sequence" +msgstr "Sequenza" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__template_id +msgid "Template" +msgstr "Modello" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "Dettagli procedura guidata classificazione DMS" diff --git a/dms_field_auto_classification/i18n/sv.po b/dms_field_auto_classification/i18n/sv.po new file mode 100644 index 000000000..2a5849f8d --- /dev/null +++ b/dms_field_auto_classification/i18n/sv.po @@ -0,0 +1,106 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_field_auto_classification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_uid +msgid "Created by" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__create_date +msgid "Created on" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__detail_ids +msgid "Details" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__display_name +msgid "Display Name" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template +msgid "Dms Classification Template" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_dms_classification_template_detail +msgid "Dms Classification Template Detail" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__field_id +msgid "Field" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__id +msgid "ID" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__index +msgid "Index" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__write_date +msgid "Last Updated on" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model_id +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__model_id +msgid "Model" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template__model +msgid "Model name" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__parent_id +msgid "Parent" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__record_ref +msgid "Record Referenced" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_dms_classification_template_detail__sequence +msgid "Sequence" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model.fields,field_description:dms_field_auto_classification.field_wizard_dms_classification_detail__template_id +msgid "Template" +msgstr "" + +#. module: dms_field_auto_classification +#: model:ir.model,name:dms_field_auto_classification.model_wizard_dms_classification_detail +msgid "Wizard Dms Classification Detail" +msgstr "" diff --git a/dms_field_auto_classification/models/__init__.py b/dms_field_auto_classification/models/__init__.py new file mode 100644 index 000000000..cb95092bf --- /dev/null +++ b/dms_field_auto_classification/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import dms_classification_template diff --git a/dms_field_auto_classification/models/dms_classification_template.py b/dms_field_auto_classification/models/dms_classification_template.py new file mode 100644 index 000000000..77fe1b647 --- /dev/null +++ b/dms_field_auto_classification/models/dms_classification_template.py @@ -0,0 +1,46 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class DmsClassificationTemplate(models.Model): + _inherit = "dms.classification.template" + + model_id = fields.Many2one( + comodel_name="ir.model", string="Model", domain=[("transient", "=", False)] + ) + model = fields.Char( + compute="_compute_model", string="Model name", compute_sudo=True + ) + detail_ids = fields.One2many( + string="Details", + comodel_name="dms.classification.template.detail", + inverse_name="parent_id", + ) + + @api.depends("model_id") + def _compute_model(self): + for item in self: + item.model = item.model_id.model + + +class DmsClassificationTemplateDetail(models.Model): + _name = "dms.classification.template.detail" + _description = "Dms Classification Template Detail" + _order = "sequence, field_id" + + parent_id = fields.Many2one( + comodel_name="dms.classification.template", + string="Parent", + ) + model_id = fields.Many2one( + related="parent_id.model_id", + ) + field_id = fields.Many2one( + comodel_name="ir.model.fields", + domain="[('model_id', '=', model_id)]", + string="Field", + ) + index = fields.Integer(required=True, default=0) + sequence = fields.Integer(required=True, default=10) diff --git a/dms_field_auto_classification/pyproject.toml b/dms_field_auto_classification/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/dms_field_auto_classification/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/dms_field_auto_classification/readme/CONFIGURE.md b/dms_field_auto_classification/readme/CONFIGURE.md new file mode 100644 index 000000000..7a851d3ab --- /dev/null +++ b/dms_field_auto_classification/readme/CONFIGURE.md @@ -0,0 +1,14 @@ +1. Go to Documents / Configuration / Classification Templates and + create or edit a template. +2. You can set a model to which it is linked (res.partner for example). +3. You can define the details to indicate which field is referenced by + the defined filename pattern. + +Full example from res.partner: + +Filename pattern: (\[0-9\]{8}\[A-Z\]).\*.pdf Details: VAT (field) and 0 +(index) Directory Pattern example 1: {0} \> This will attempt to add the +files to the directory linked to the partner with the VAT name. +Directory Pattern example 2: {0} / Misc \> This will attempt to add the +files to the "Misc" subdirectory linked to the partner with the VAT +name. diff --git a/dms_field_auto_classification/readme/CONTRIBUTORS.md b/dms_field_auto_classification/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5fee39042 --- /dev/null +++ b/dms_field_auto_classification/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/dms_field_auto_classification/readme/DESCRIPTION.md b/dms_field_auto_classification/readme/DESCRIPTION.md new file mode 100644 index 000000000..9d3d71216 --- /dev/null +++ b/dms_field_auto_classification/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +Automatically classify files within a .zip file to the corresponding +directory(s) related to an embedded DMS. diff --git a/dms_field_auto_classification/readme/USAGE.md b/dms_field_auto_classification/readme/USAGE.md new file mode 100644 index 000000000..c8bf4ea52 --- /dev/null +++ b/dms_field_auto_classification/readme/USAGE.md @@ -0,0 +1,10 @@ +1. Go to Documents / Auto Classification and select a template and a + .zip file. +2. Press the Analyze button +3. As many lines will be set as the number of files contained in the + .zip file and apply the filename pattern. +4. The record to which they are related (res.partner for example) will + be show on the lines. +5. Press the Classify button +6. The files (dms.file) will be created in the corresponding + directories. diff --git a/dms_field_auto_classification/security/ir.model.access.csv b/dms_field_auto_classification/security/ir.model.access.csv new file mode 100644 index 000000000..e16b79fc4 --- /dev/null +++ b/dms_field_auto_classification/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink +access_dms_classification_template_detail_manager,dms_classification_template_detail_manager,model_dms_classification_template_detail,dms.group_dms_manager,1,1,1,1 diff --git a/dms_field_auto_classification/static/description/icon.png b/dms_field_auto_classification/static/description/icon.png new file mode 100644 index 000000000..9fd5b327a Binary files /dev/null and b/dms_field_auto_classification/static/description/icon.png differ diff --git a/dms_field_auto_classification/static/description/icon.svg b/dms_field_auto_classification/static/description/icon.svg new file mode 100644 index 000000000..38e821a45 --- /dev/null +++ b/dms_field_auto_classification/static/description/icon.svg @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dms_field_auto_classification/static/description/index.html b/dms_field_auto_classification/static/description/index.html new file mode 100644 index 000000000..31cce4207 --- /dev/null +++ b/dms_field_auto_classification/static/description/index.html @@ -0,0 +1,470 @@ + + + + + +README.rst + + + +
      + + + +Odoo Community Association + +
      +

      Auto classify files into embedded DMS

      + +

      Beta License: AGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

      +

      Automatically classify files within a .zip file to the corresponding +directory(s) related to an embedded DMS.

      +

      Table of contents

      + +
      +

      Configuration

      +
        +
      1. Go to Documents / Configuration / Classification Templates and create +or edit a template.
      2. +
      3. You can set a model to which it is linked (res.partner for example).
      4. +
      5. You can define the details to indicate which field is referenced by +the defined filename pattern.
      6. +
      +

      Full example from res.partner:

      +

      Filename pattern: ([0-9]{8}[A-Z]).*.pdf Details: VAT (field) and 0 +(index) Directory Pattern example 1: {0} > This will attempt to add the +files to the directory linked to the partner with the VAT name. +Directory Pattern example 2: {0} / Misc > This will attempt to add the +files to the “Misc” subdirectory linked to the partner with the VAT +name.

      +
      +
      +

      Usage

      +
        +
      1. Go to Documents / Auto Classification and select a template and a +.zip file.
      2. +
      3. Press the Analyze button
      4. +
      5. As many lines will be set as the number of files contained in the +.zip file and apply the filename pattern.
      6. +
      7. The record to which they are related (res.partner for example) will +be show on the lines.
      8. +
      9. Press the Classify button
      10. +
      11. The files (dms.file) will be created in the corresponding +directories.
      12. +
      +
      +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Tecnativa
      • +
      +
      +
      +

      Contributors

      +
        +
      • Tecnativa:
          +
        • Víctor Martínez
        • +
        • Pedro M. Baeza
        • +
        +
      • +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      Current maintainer:

      +

      victoralmau

      +

      This module is part of the OCA/dms project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      +
      + + diff --git a/dms_field_auto_classification/tests/__init__.py b/dms_field_auto_classification/tests/__init__.py new file mode 100644 index 000000000..0be859d20 --- /dev/null +++ b/dms_field_auto_classification/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from . import test_dms_field_auto_classification diff --git a/dms_field_auto_classification/tests/data/test.zip b/dms_field_auto_classification/tests/data/test.zip new file mode 100644 index 000000000..155578038 Binary files /dev/null and b/dms_field_auto_classification/tests/data/test.zip differ diff --git a/dms_field_auto_classification/tests/test_dms_field_auto_classification.py b/dms_field_auto_classification/tests/test_dms_field_auto_classification.py new file mode 100644 index 000000000..720047d4f --- /dev/null +++ b/dms_field_auto_classification/tests/test_dms_field_auto_classification.py @@ -0,0 +1,193 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from base64 import b64encode +from os import path + +from odoo.tests import Form, new_test_user +from odoo.tests.common import users + +from odoo.addons.base.tests.common import BaseCommon + + +class TestDmsFieldAutoClassification(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, test_dms_field=True)) + cls.template = cls.env.ref( + "dms_field_auto_classification.dms_classification_template_partners" + ) + cls.user = new_test_user( + cls.env, login="test_dms_manager_user", groups="dms.group_dms_manager" + ) + access_group = cls.env.ref("dms.access_group_01_demo") + access_group.explicit_user_ids = [(4, cls.user.id)] + cls.env.ref("dms_field.field_template_partner").unlink() + file_template = cls.env["dms.field.template"].create( + { + "name": "Test partner template", + "storage_id": cls.env.ref("dms.storage_demo").id, + "model_id": cls.env.ref("base.model_res_partner").id, + "group_ids": [(4, access_group.id)], + "directory_format_name": "{{object.vat}}", + } + ) + file_template_ctx = file_template.with_context( + res_model=file_template._name, res_id=file_template.id + ) + file_template_ctx.create_dms_directory() + file_template_ctx.invalidate_model() + cls.partner_a = cls.env["res.partner"].create( + { + "name": "Test partner A", + "vat": "82326033V", + } + ) + cls.partner_b = cls.env["res.partner"].create( + { + "name": "Test partner B", + "vat": "58426469Y", + } + ) + cls.wizard = cls._create_wizard_dms_classification(cls.template) + cls.extra_wizard = cls._create_wizard_dms_classification(cls.template) + + @classmethod + def _data_file(cls, filename, encoding=None): + mode = "rt" if encoding else "rb" + with open(path.join(path.dirname(__file__), filename), mode) as file: + data = file.read() + if encoding: + data = data.encode(encoding) + return b64encode(data) + + @classmethod + def _create_wizard_dms_classification(cls, template): + wizard_form = Form(cls.env["wizard.dms.classification"]) + wizard_form.template_id = template + wizard_form.data_file = cls._data_file("data/test.zip") + return wizard_form.save() + + def test_partner_misc(self): + self.assertEqual(self.partner_a.dms_directory_ids.name, "82326033V") + self.assertEqual(self.partner_b.dms_directory_ids.name, "58426469Y") + + @users("test_dms_manager_user") + def test_wizard_dms_clasification_process(self): + self.wizard = self.wizard.with_user(self.env.user) + self.assertEqual(self.wizard.state, "draft") + # Wizard - Analyze process + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 2) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("82326033V.pdf", file_names) + self.assertIn("58426469Y.pdf", file_names) + detail_1 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "82326033V.pdf" + ) + self.assertEqual(detail_1.state, "to_classify") + self.assertEqual(detail_1.directory_id, self.partner_a.dms_directory_ids) + self.assertEqual(detail_1.record_ref, self.partner_a) + detail_2 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "58426469Y.pdf" + ) + self.assertEqual(detail_2.state, "to_classify") + self.assertEqual(detail_2.directory_id, self.partner_b.dms_directory_ids) + self.assertEqual(detail_2.record_ref, self.partner_b) + # Wizard - Classify process + res = self.wizard.action_classify() + dms_files = self.env[res["res_model"]].search(res["domain"]) + self.assertEqual(len(dms_files), 2) + self.assertEqual( + detail_1.file_id.directory_id, self.partner_a.dms_directory_ids + ) + self.assertEqual(detail_1.file_id.name, "82326033V.pdf") + self.assertTrue(detail_1.file_id.content) + self.assertEqual(detail_1.file_id.res_model, self.partner_a._name) + self.assertEqual(detail_1.file_id.res_id, self.partner_a.id) + self.assertEqual( + detail_2.file_id.directory_id, self.partner_b.dms_directory_ids + ) + self.assertEqual(detail_2.file_id.name, "58426469Y.pdf") + self.assertTrue(detail_2.file_id.content) + self.assertEqual(detail_2.file_id.res_model, self.partner_b._name) + self.assertEqual(detail_2.file_id.res_id, self.partner_b.id) + # Extra wizard + self.extra_wizard = self.extra_wizard.with_user(self.env.user) + self.assertEqual(self.extra_wizard.state, "draft") + # New Wizard - Analyze process + self.extra_wizard.action_analyze() + self.assertEqual(self.extra_wizard.state, "analyze") + self.assertEqual(len(self.extra_wizard.detail_ids), 2) + file_names = self.extra_wizard.mapped("detail_ids.file_name") + self.assertIn("82326033V.pdf", file_names) + self.assertIn("58426469Y.pdf", file_names) + detail_1 = self.extra_wizard.detail_ids.filtered( + lambda x: x.file_name == "82326033V.pdf" + ) + self.assertEqual(detail_1.directory_id, self.partner_a.dms_directory_ids) + self.assertTrue(detail_1.file_id) + self.assertEqual(detail_1.record_ref, self.partner_a) + self.assertEqual(detail_1.state, "classified") + detail_2 = self.extra_wizard.detail_ids.filtered( + lambda x: x.file_name == "58426469Y.pdf" + ) + self.assertEqual(detail_2.directory_id, self.partner_b.dms_directory_ids) + self.assertTrue(detail_2.file_id) + self.assertEqual(detail_2.record_ref, self.partner_b) + self.assertEqual(detail_1.state, "classified") + # New Wizard - Classify process + res = self.extra_wizard.action_classify() + new_dms_files = self.env[res["res_model"]].search(res["domain"]) - dms_files + self.assertEqual(len(new_dms_files), 0) + + @users("test_dms_manager_user") + def test_wizard_dms_clasification_process_filename_pattern(self): + self.template.filename_pattern = self.template.filename_pattern.replace( + ".pdf", ".txt" + ) + self.assertEqual(self.wizard.state, "draft") + self.wizard = self.wizard.with_user(self.env.user) + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 0) + + @users("test_dms_manager_user") + def test_wizard_dms_clasification_process_subdirectory(self): + self.template.directory_pattern = "{0} / Misc" + # Create subdirectory to partner a + directory_misc_a = self.env["dms.directory"].create( + {"name": "Misc", "parent_id": self.partner_a.dms_directory_ids.id} + ) + # Create subdirectory to partner b + directory_misc_b = self.env["dms.directory"].create( + {"name": "Misc", "parent_id": self.partner_b.dms_directory_ids.id} + ) + # Wizard - Analyze process + self.wizard = self.wizard.with_user(self.env.user) + self.wizard.action_analyze() + self.assertEqual(self.wizard.state, "analyze") + self.assertEqual(len(self.wizard.detail_ids), 2) + file_names = self.wizard.mapped("detail_ids.file_name") + self.assertIn("82326033V.pdf", file_names) + self.assertIn("58426469Y.pdf", file_names) + detail_1 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "82326033V.pdf" + ) + self.assertEqual(detail_1.state, "to_classify") + self.assertEqual(detail_1.directory_id, directory_misc_a) + self.assertEqual(detail_1.record_ref, self.partner_a) + detail_2 = self.wizard.detail_ids.filtered( + lambda x: x.file_name == "58426469Y.pdf" + ) + self.assertEqual(detail_2.state, "to_classify") + self.assertEqual(detail_2.directory_id, directory_misc_b) + self.assertEqual(detail_2.record_ref, self.partner_b) + # Wizard - Classify process + res = self.wizard.action_classify() + dms_files = self.env[res["res_model"]].search(res["domain"]) + self.assertEqual(len(dms_files), 2) + self.assertEqual(detail_1.file_id.directory_id, directory_misc_a) + self.assertEqual(detail_2.file_id.directory_id, directory_misc_b) diff --git a/dms_field_auto_classification/views/dms_classification_template_views.xml b/dms_field_auto_classification/views/dms_classification_template_views.xml new file mode 100644 index 000000000..a91a70347 --- /dev/null +++ b/dms_field_auto_classification/views/dms_classification_template_views.xml @@ -0,0 +1,37 @@ + + + + dms.classification.template tree + dms.classification.template + + + + + + + + + dms.classification.template form + dms.classification.template + + + + + + + + + + + + + + + + diff --git a/dms_field_auto_classification/wizards/__init__.py b/dms_field_auto_classification/wizards/__init__.py new file mode 100644 index 000000000..4ba9cc23a --- /dev/null +++ b/dms_field_auto_classification/wizards/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import wizard_dms_classification diff --git a/dms_field_auto_classification/wizards/wizard_dms_classification.py b/dms_field_auto_classification/wizards/wizard_dms_classification.py new file mode 100644 index 000000000..7920d1347 --- /dev/null +++ b/dms_field_auto_classification/wizards/wizard_dms_classification.py @@ -0,0 +1,77 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import re + +from odoo import api, fields, models + + +class WizardDmsClassificationDetail(models.TransientModel): + _inherit = "wizard.dms.classification.detail" + + template_id = fields.Many2one(related="parent_id.template_id") + record_ref = fields.Reference( + string="Record Referenced", + compute="_compute_record_ref", + selection=lambda self: self._get_ref_selection(), + ) + + @api.model + def _get_ref_selection(self): + models = self.env["ir.model"].sudo().search([("transient", "=", False)]) + return [(model.model, model.name) for model in models] + + @api.depends( + "directory_id", + "directory_id.root_directory_id", + "directory_id.res_model", + "directory_id.res_id", + ) + def _compute_record_ref(self): + """Set the linked record according to directory or root directory (to be + correct if we are in a subdirectory).""" + for record in self: + directory = False + if record.directory_id.res_model and record.directory_id.res_id: + directory = record.directory_id + elif ( + record.directory_id.root_directory_id.res_model + and record.directory_id.root_directory_id.res_id + ): + directory = record.directory_id.root_directory_id + record.record_ref = ( + f"{directory.res_model},{directory.res_id}" if directory else False + ) + + @api.depends("file_name", "template_id.model_id") + def _compute_directory_id(self): + """Overwrite to redefine the directory if the template has a linked model.""" + self_with_model = self.filtered(lambda x: x.template_id.model_id) + directory_model = self.env["dms.directory"].sudo() + for item in self_with_model: + domain = [ + ("res_model", "=", item.template_id.model_id.model), + ("res_id", ">", 0), + ] + directories = directory_model.search(domain) + # We also add the subdirectorior because they are necessary and have not + # set res_model and res_id + directories += directories.mapped("child_directory_ids") + if directories: + matches = re.search(item.template_id.filename_pattern, item.file_name) + if matches: + directory_pattern = item.template_id.directory_pattern + for detail in item.template_id.detail_ids: + matches_value = matches.groups()[detail.index] + # Change directory pattern if index in pattern + expected = f"{{{detail.index}}}" + if expected in directory_pattern: + directory_pattern = directory_pattern.replace( + expected, matches_value + ) + # Search directories according to directory_pattern + item.directory_id = self.parent_id._get_directory_from_pattern( + directory_pattern, directories + ) + return super( + WizardDmsClassificationDetail, (self - self_with_model) + )._compute_directory_id() diff --git a/dms_field_auto_classification/wizards/wizard_dms_classification_views.xml b/dms_field_auto_classification/wizards/wizard_dms_classification_views.xml new file mode 100644 index 000000000..a7a91ad61 --- /dev/null +++ b/dms_field_auto_classification/wizards/wizard_dms_classification_views.xml @@ -0,0 +1,19 @@ + + + + wizard.dms.classification form + wizard.dms.classification + + + + + + + + diff --git a/dms_user_role/README.rst b/dms_user_role/README.rst new file mode 100644 index 000000000..86edfa162 --- /dev/null +++ b/dms_user_role/README.rst @@ -0,0 +1,97 @@ +============= +DMS User Role +============= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:35aa1f1c4b7cc8c6de3e9f920b4c825356bfae6c0c9a675a5ab84cdaaec039eb + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/dms_user_role + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-dms_user_role + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Use of roles (module base_user_role) in DMS access groups. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +1. Go to Settings / Users & Companies / Roles and create a new one. +2. Go to Documents / Configuration / Access groups and create or edit + one. +3. Set in the "Roles" tab the one we have just created. +4. Go back to the role, edit it and add an extra user. +5. The extra user will have been added in the "Users" tab. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/dms_user_role/__init__.py b/dms_user_role/__init__.py new file mode 100644 index 000000000..4b76c7b2d --- /dev/null +++ b/dms_user_role/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/dms_user_role/__manifest__.py b/dms_user_role/__manifest__.py new file mode 100644 index 000000000..73b8102d5 --- /dev/null +++ b/dms_user_role/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "DMS User Role", + "version": "18.0.1.0.0", + "category": "Document Management", + "website": "https://github.com/OCA/dms", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["dms", "base_user_role"], + "installable": True, + "data": [ + "views/dms_access_group_views.xml", + ], + "maintainers": ["victoralmau"], +} diff --git a/dms_user_role/i18n/dms_user_role.pot b/dms_user_role/i18n/dms_user_role.pot new file mode 100644 index 000000000..1ea0df0f4 --- /dev/null +++ b/dms_user_role/i18n/dms_user_role.pot @@ -0,0 +1,25 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_user_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: dms_user_role +#: model:ir.model,name:dms_user_role.model_dms_access_group +msgid "Record Access Groups" +msgstr "" + +#. module: dms_user_role +#: model:ir.model.fields,field_description:dms_user_role.field_dms_access_group__role_ids +#: model_terms:ir.ui.view,arch_db:dms_user_role.view_dms_access_groups_form +msgid "Roles" +msgstr "" diff --git a/dms_user_role/i18n/es.po b/dms_user_role/i18n/es.po new file mode 100644 index 000000000..feb609f5f --- /dev/null +++ b/dms_user_role/i18n/es.po @@ -0,0 +1,29 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_user_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-03-05 10:23+0000\n" +"PO-Revision-Date: 2024-10-08 17:06+0000\n" +"Last-Translator: Víctor Martínez \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: dms_user_role +#: model:ir.model,name:dms_user_role.model_dms_access_group +msgid "Record Access Groups" +msgstr "Grupos de acceso de registro" + +#. module: dms_user_role +#: model:ir.model.fields,field_description:dms_user_role.field_dms_access_group__role_ids +#: model_terms:ir.ui.view,arch_db:dms_user_role.view_dms_access_groups_form +msgid "Roles" +msgstr "Roles" diff --git a/dms_user_role/i18n/it.po b/dms_user_role/i18n/it.po new file mode 100644 index 000000000..48e9074c4 --- /dev/null +++ b/dms_user_role/i18n/it.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_user_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-04-04 16:35+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" + +#. module: dms_user_role +#: model:ir.model,name:dms_user_role.model_dms_access_group +msgid "Record Access Groups" +msgstr "Gruppi di accesso al record" + +#. module: dms_user_role +#: model:ir.model.fields,field_description:dms_user_role.field_dms_access_group__role_ids +#: model_terms:ir.ui.view,arch_db:dms_user_role.view_dms_access_groups_form +msgid "Roles" +msgstr "Ruoli" diff --git a/dms_user_role/i18n/sv.po b/dms_user_role/i18n/sv.po new file mode 100644 index 000000000..9ed50432d --- /dev/null +++ b/dms_user_role/i18n/sv.po @@ -0,0 +1,28 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * dms_user_role +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-09-19 13:31+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: dms_user_role +#: model:ir.model,name:dms_user_role.model_dms_access_group +msgid "Record Access Groups" +msgstr "Grupper för åtkomst till register" + +#. module: dms_user_role +#: model:ir.model.fields,field_description:dms_user_role.field_dms_access_group__role_ids +#: model_terms:ir.ui.view,arch_db:dms_user_role.view_dms_access_groups_form +msgid "Roles" +msgstr "Roller" diff --git a/dms_user_role/models/__init__.py b/dms_user_role/models/__init__.py new file mode 100644 index 000000000..227172e52 --- /dev/null +++ b/dms_user_role/models/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from . import dms_access_group diff --git a/dms_user_role/models/dms_access_group.py b/dms_user_role/models/dms_access_group.py new file mode 100644 index 000000000..9c0e2e757 --- /dev/null +++ b/dms_user_role/models/dms_access_group.py @@ -0,0 +1,26 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class DmsAccessGroup(models.Model): + _inherit = "dms.access.group" + + role_ids = fields.Many2many( + comodel_name="res.users.role", + relation="dms_access_group_user_roles_rel", + column1="gid", + column2="rid", + string="Roles", + ) + + @api.depends("role_ids", "role_ids.users") + def _compute_users(self): + """Add the corresponding depends and the users of the roles.""" + res = super()._compute_users() + for record in self.filtered("role_ids"): + users = record.users + users |= record.mapped("role_ids.users") + record.update({"users": users, "count_users": len(users)}) + return res diff --git a/dms_user_role/pyproject.toml b/dms_user_role/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/dms_user_role/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/dms_user_role/readme/CONTRIBUTORS.md b/dms_user_role/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5fee39042 --- /dev/null +++ b/dms_user_role/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/dms_user_role/readme/DESCRIPTION.md b/dms_user_role/readme/DESCRIPTION.md new file mode 100644 index 000000000..737c57ebf --- /dev/null +++ b/dms_user_role/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Use of roles (module base_user_role) in DMS access groups. diff --git a/dms_user_role/readme/USAGE.md b/dms_user_role/readme/USAGE.md new file mode 100644 index 000000000..b818e0024 --- /dev/null +++ b/dms_user_role/readme/USAGE.md @@ -0,0 +1,6 @@ +1. Go to Settings / Users & Companies / Roles and create a new one. +2. Go to Documents / Configuration / Access groups and create or edit + one. +3. Set in the "Roles" tab the one we have just created. +4. Go back to the role, edit it and add an extra user. +5. The extra user will have been added in the "Users" tab. diff --git a/dms_user_role/static/description/icon.png b/dms_user_role/static/description/icon.png new file mode 100644 index 000000000..a561495f1 Binary files /dev/null and b/dms_user_role/static/description/icon.png differ diff --git a/dms_user_role/static/description/index.html b/dms_user_role/static/description/index.html new file mode 100644 index 000000000..90b5422ec --- /dev/null +++ b/dms_user_role/static/description/index.html @@ -0,0 +1,441 @@ + + + + + +DMS User Role + + + +
      +

      DMS User Role

      + + +

      Beta License: AGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

      +

      Use of roles (module base_user_role) in DMS access groups.

      +

      Table of contents

      + +
      +

      Usage

      +
        +
      1. Go to Settings / Users & Companies / Roles and create a new one.
      2. +
      3. Go to Documents / Configuration / Access groups and create or edit +one.
      4. +
      5. Set in the “Roles” tab the one we have just created.
      6. +
      7. Go back to the role, edit it and add an extra user.
      8. +
      9. The extra user will have been added in the “Users” tab.
      10. +
      +
      +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Tecnativa
      • +
      +
      +
      +

      Contributors

      +
        +
      • Tecnativa:
          +
        • Víctor Martínez
        • +
        • Pedro M. Baeza
        • +
        +
      • +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      Current maintainer:

      +

      victoralmau

      +

      This module is part of the OCA/dms project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      + + diff --git a/dms_user_role/tests/__init__.py b/dms_user_role/tests/__init__.py new file mode 100644 index 000000000..f512007a5 --- /dev/null +++ b/dms_user_role/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +from . import test_dms_user_role diff --git a/dms_user_role/tests/test_dms_user_role.py b/dms_user_role/tests/test_dms_user_role.py new file mode 100644 index 000000000..cd7222b3a --- /dev/null +++ b/dms_user_role/tests/test_dms_user_role.py @@ -0,0 +1,52 @@ +# Copyright 2024-2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import Command +from odoo.tests import new_test_user +from odoo.tools import mute_logger + +from odoo.addons.base.tests.common import BaseCommon + + +class TestDmsUserRole(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_a = new_test_user(cls.env, login="test_user_a") + cls.user_b = new_test_user(cls.env, login="test_user_b") + cls.user_c = new_test_user(cls.env, login="test_user_c") + cls.access_group = cls.env["dms.access.group"].create( + {"name": "Test group", "explicit_user_ids": [Command.link(cls.user_a.id)]} + ) + cls.user_role = cls.env["res.users.role"].create({"name": "Test user role"}) + + @mute_logger("odoo.models.unlink") + def test_user_role_change(self): + self.assertIn(self.user_a, self.access_group.users) + self.assertNotIn(self.user_b, self.access_group.users) + self.assertNotIn(self.user_c, self.access_group.users) + # Add User a to user_role: Without changes + self.user_role.line_ids = [Command.create({"user_id": self.user_a.id})] + self.assertIn(self.user_a, self.access_group.users) + self.assertNotIn(self.user_b, self.access_group.users) + self.assertNotIn(self.user_c, self.access_group.users) + # Set role to access group: Without changes + self.access_group.role_ids = [Command.link(self.user_role.id)] + self.assertIn(self.user_a, self.access_group.users) + self.assertNotIn(self.user_b, self.access_group.users) + self.assertNotIn(self.user_c, self.access_group.users) + # Add User b to user_role: User b is added to access groups + self.user_role.line_ids = [Command.create({"user_id": self.user_b.id})] + self.assertIn(self.user_a, self.access_group.users) + self.assertIn(self.user_b, self.access_group.users) + self.assertNotIn(self.user_c, self.access_group.users) + # Add User c to user_role: User c is added to access groups + self.user_role.line_ids = [Command.create({"user_id": self.user_c.id})] + self.assertIn(self.user_a, self.access_group.users) + self.assertIn(self.user_b, self.access_group.users) + self.assertIn(self.user_c, self.access_group.users) + # Remove User c from user role: User c is removed from access group + line_b = self.user_role.line_ids.filtered(lambda x: x.user_id == self.user_b) + self.user_role.line_ids = [Command.delete(line_b.id)] + self.assertIn(self.user_a, self.access_group.users) + self.assertNotIn(self.user_b, self.access_group.users) + self.assertIn(self.user_c, self.access_group.users) diff --git a/dms_user_role/views/dms_access_group_views.xml b/dms_user_role/views/dms_access_group_views.xml new file mode 100644 index 000000000..10c233207 --- /dev/null +++ b/dms_user_role/views/dms_access_group_views.xml @@ -0,0 +1,20 @@ + + + + dms_access.group.form + dms.access.group + + + + + + + + + + + + + + + diff --git a/eslint.config.cjs b/eslint.config.cjs index dd0cbe0ae..b52f51a67 100644 --- a/eslint.config.cjs +++ b/eslint.config.cjs @@ -194,7 +194,7 @@ const config = [{ }, }, { - files: ["**/*.esm.js", "**/*test.js"], + files: ["**/*.esm.js"], languageOptions: { ecmaVersion: 2024, diff --git a/hr_dms_field/README.rst b/hr_dms_field/README.rst new file mode 100644 index 000000000..b05ee2825 --- /dev/null +++ b/hr_dms_field/README.rst @@ -0,0 +1,107 @@ +=========================== +Add dms field for employees +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:99c1af9016e8a5e75bd43f6403d63230fbb9cfea89cb2e5e7e5885ec751a9db0 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/hr_dms_field + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-hr_dms_field + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Add the Documents tab with the files in the employee's form view. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +1. *Go to Documents > Configuration > File templates* and create a new + record. +2. Set a storage, a model (hr.employee) and the access groups you want. +3. Click on the "Documents" tab icon and a folder hierarchy will be + created. +4. You can set here the hierarchy of directories, subdirectories and + files you need, this hierarchy will be used as a base when creating a + new record (res.partner for example). + +Usage +===== + +#. Go to the form view of an existing employee and click on the +"Documents" tab icon, a hierarchy of folders and files linked to that +record will be created. #. Create a new employee. A hierarchy of folders +and files linked to that record will be created. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Víctor Martínez + - Pedro M. Baeza + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-victoralmau| image:: https://github.com/victoralmau.png?size=40px + :target: https://github.com/victoralmau + :alt: victoralmau + +Current `maintainer `__: + +|maintainer-victoralmau| + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/hr_dms_field/__init__.py b/hr_dms_field/__init__.py new file mode 100644 index 000000000..4b76c7b2d --- /dev/null +++ b/hr_dms_field/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import models diff --git a/hr_dms_field/__manifest__.py b/hr_dms_field/__manifest__.py new file mode 100644 index 000000000..d445cd3bf --- /dev/null +++ b/hr_dms_field/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Add dms field for employees", + "version": "18.0.1.0.0", + "category": "Human Resources", + "website": "https://github.com/OCA/dms", + "author": "Tecnativa, Odoo Community Association (OCA)", + "license": "AGPL-3", + "depends": ["hr", "dms_field"], + "installable": True, + "data": [ + "security/security.xml", + "views/hr_employee_view.xml", + "views/res_config_settings_view.xml", + ], + "demo": ["demo/dms_data.xml"], + "assets": { + "web.assets_backend": [ + "hr_dms_field/static/src/js/**/*", + ], + }, + "maintainers": ["victoralmau"], +} diff --git a/hr_dms_field/demo/dms_data.xml b/hr_dms_field/demo/dms_data.xml new file mode 100644 index 000000000..1a1be244b --- /dev/null +++ b/hr_dms_field/demo/dms_data.xml @@ -0,0 +1,21 @@ + + + + Everyone for Employee DMS + + + + + + + Employee + + + + + + {{object.display_name}} (employee) + + diff --git a/hr_dms_field/i18n/es.po b/hr_dms_field/i18n/es.po new file mode 100644 index 000000000..84cdb7f21 --- /dev/null +++ b/hr_dms_field/i18n/es.po @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-02-07 16:03+0000\n" +"PO-Revision-Date: 2025-04-04 11:06+0000\n" +"Last-Translator: Víctor Martínez \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.2\n" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.res_config_settings_view_form +msgid "Allow employees to access their DMS Documents." +msgstr "Permitir a los empleados acceder a sus Documentos DMS." + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_base__dms_directory_ids +msgid "DMS Directories" +msgstr "Directorios DMS" + +#. module: hr_dms_field +#: model:res.groups,name:hr_dms_field.group_hr_public_dms +msgid "DMS Is accessible publicly on employee profile" +msgstr "DMS es accesible públicamente en el perfil del empleado" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.hr_employee_public_view_form +#: model_terms:ir.ui.view,arch_db:hr_dms_field.view_employee_form +msgid "Documents" +msgstr "Documentos" + +#. module: hr_dms_field +#: model:dms.access.group,name:hr_dms_field.read_access_hr_employee_group +msgid "Everyone for Employee DMS" +msgstr "Todos para empleados DMS" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_public__is_logged +msgid "Is Logged" +msgstr "Está registrado/a" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_public +msgid "Public Employee" +msgstr "Empleado Público" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_res_config_settings__group_hr_public_dms +msgid "Show DMS Documents to logged employees" +msgstr "Mostrar documentos DMS a las empleados logeados" diff --git a/hr_dms_field/i18n/hr_dms_field.pot b/hr_dms_field/i18n/hr_dms_field.pot new file mode 100644 index 000000000..4a3275e4a --- /dev/null +++ b/hr_dms_field/i18n/hr_dms_field.pot @@ -0,0 +1,65 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.res_config_settings_view_form +msgid "Allow employees to access their DMS Documents." +msgstr "" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_base +msgid "Basic Employee" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_base__dms_directory_ids +msgid "DMS Directories" +msgstr "" + +#. module: hr_dms_field +#: model:res.groups,name:hr_dms_field.group_hr_public_dms +msgid "DMS Is accessible publicly on employee profile" +msgstr "" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.hr_employee_public_view_form +#: model_terms:ir.ui.view,arch_db:hr_dms_field.view_employee_form +msgid "Documents" +msgstr "" + +#. module: hr_dms_field +#: model:dms.access.group,name:hr_dms_field.read_access_hr_employee_group +msgid "Everyone for Employee DMS" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_public__is_logged +msgid "Is Logged" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_public +msgid "Public Employee" +msgstr "" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_res_config_settings__group_hr_public_dms +msgid "Show DMS Documents to logged employees" +msgstr "" diff --git a/hr_dms_field/i18n/it.po b/hr_dms_field/i18n/it.po new file mode 100644 index 000000000..76558def1 --- /dev/null +++ b/hr_dms_field/i18n/it.po @@ -0,0 +1,68 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * hr_dms_field +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-05 11:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.2\n" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.res_config_settings_view_form +msgid "Allow employees to access their DMS Documents." +msgstr "Consente ai dipendenti di accedere ai propri documenti DMS." + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_base +msgid "Basic Employee" +msgstr "Dipendente base" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_base__dms_directory_ids +msgid "DMS Directories" +msgstr "Cartelle DMS" + +#. module: hr_dms_field +#: model:res.groups,name:hr_dms_field.group_hr_public_dms +msgid "DMS Is accessible publicly on employee profile" +msgstr "DMS è accessibile pubblicamente nel profilo dipendente" + +#. module: hr_dms_field +#: model_terms:ir.ui.view,arch_db:hr_dms_field.hr_employee_public_view_form +#: model_terms:ir.ui.view,arch_db:hr_dms_field.view_employee_form +msgid "Documents" +msgstr "Documenti" + +#. module: hr_dms_field +#: model:dms.access.group,name:hr_dms_field.read_access_hr_employee_group +msgid "Everyone for Employee DMS" +msgstr "Tutti per il DMS dei dipendenti" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_hr_employee_public__is_logged +msgid "Is Logged" +msgstr "È collegato" + +#. module: hr_dms_field +#: model:ir.model,name:hr_dms_field.model_hr_employee_public +msgid "Public Employee" +msgstr "Dipendente pubblico" + +#. module: hr_dms_field +#: model:ir.model.fields,field_description:hr_dms_field.field_res_config_settings__group_hr_public_dms +msgid "Show DMS Documents to logged employees" +msgstr "Mostra i documenti DMS ai dipendenti collegati" diff --git a/hr_dms_field/models/__init__.py b/hr_dms_field/models/__init__.py new file mode 100644 index 000000000..4b0c3964b --- /dev/null +++ b/hr_dms_field/models/__init__.py @@ -0,0 +1,5 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from . import hr_employee +from . import hr_employee_public +from . import res_config_settings diff --git a/hr_dms_field/models/hr_employee.py b/hr_dms_field/models/hr_employee.py new file mode 100644 index 000000000..0e6d9856c --- /dev/null +++ b/hr_dms_field/models/hr_employee.py @@ -0,0 +1,9 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import models + + +class HrEmployeeBase(models.AbstractModel): + _name = "hr.employee.base" + _inherit = ["hr.employee.base", "dms.field.mixin"] diff --git a/hr_dms_field/models/hr_employee_public.py b/hr_dms_field/models/hr_employee_public.py new file mode 100644 index 000000000..83fd1a448 --- /dev/null +++ b/hr_dms_field/models/hr_employee_public.py @@ -0,0 +1,16 @@ +# Copyright 2024 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class HrEmployeePublic(models.Model): + _inherit = "hr.employee.public" + + is_logged = fields.Boolean(compute="_compute_is_logged", store=False) + + def _compute_is_logged(self): + self.is_logged = False + for record in self: + if self.env.user == record.user_id: + record.is_logged = True diff --git a/hr_dms_field/models/res_config_settings.py b/hr_dms_field/models/res_config_settings.py new file mode 100644 index 000000000..2e947130c --- /dev/null +++ b/hr_dms_field/models/res_config_settings.py @@ -0,0 +1,12 @@ +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + group_hr_public_dms = fields.Boolean( + string="Show DMS Documents to logged employees", + implied_group="hr_dms_field.group_hr_public_dms", + ) diff --git a/hr_dms_field/pyproject.toml b/hr_dms_field/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/hr_dms_field/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/hr_dms_field/readme/CONFIGURE.md b/hr_dms_field/readme/CONFIGURE.md new file mode 100644 index 000000000..23bf738ac --- /dev/null +++ b/hr_dms_field/readme/CONFIGURE.md @@ -0,0 +1,8 @@ +1. *Go to Documents \> Configuration \> File templates* and create a + new record. +2. Set a storage, a model (hr.employee) and the access groups you want. +3. Click on the "Documents" tab icon and a folder hierarchy will be + created. +4. You can set here the hierarchy of directories, subdirectories and + files you need, this hierarchy will be used as a base when creating + a new record (res.partner for example). diff --git a/hr_dms_field/readme/CONTRIBUTORS.md b/hr_dms_field/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..5fee39042 --- /dev/null +++ b/hr_dms_field/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Víctor Martínez + - Pedro M. Baeza diff --git a/hr_dms_field/readme/DESCRIPTION.md b/hr_dms_field/readme/DESCRIPTION.md new file mode 100644 index 000000000..4769e05dc --- /dev/null +++ b/hr_dms_field/readme/DESCRIPTION.md @@ -0,0 +1 @@ +Add the Documents tab with the files in the employee's form view. diff --git a/hr_dms_field/readme/USAGE.md b/hr_dms_field/readme/USAGE.md new file mode 100644 index 000000000..bb33eaa0f --- /dev/null +++ b/hr_dms_field/readme/USAGE.md @@ -0,0 +1,4 @@ +#\. Go to the form view of an existing employee and click on the +"Documents" tab icon, a hierarchy of folders and files linked to that +record will be created. \#. Create a new employee. A hierarchy of +folders and files linked to that record will be created. diff --git a/hr_dms_field/security/security.xml b/hr_dms_field/security/security.xml new file mode 100644 index 000000000..ac6da1e90 --- /dev/null +++ b/hr_dms_field/security/security.xml @@ -0,0 +1,17 @@ + + + + + DMS Is accessible publicly on employee profile + + + + + + + + + diff --git a/hr_dms_field/static/description/icon.png b/hr_dms_field/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/hr_dms_field/static/description/icon.png differ diff --git a/hr_dms_field/static/description/index.html b/hr_dms_field/static/description/index.html new file mode 100644 index 000000000..68604c591 --- /dev/null +++ b/hr_dms_field/static/description/index.html @@ -0,0 +1,451 @@ + + + + + +Add dms field for employees + + + +
      +

      Add dms field for employees

      + + +

      Beta License: AGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

      +

      Add the Documents tab with the files in the employee’s form view.

      +

      Table of contents

      + +
      +

      Configuration

      +
        +
      1. Go to Documents > Configuration > File templates and create a new +record.
      2. +
      3. Set a storage, a model (hr.employee) and the access groups you want.
      4. +
      5. Click on the “Documents” tab icon and a folder hierarchy will be +created.
      6. +
      7. You can set here the hierarchy of directories, subdirectories and +files you need, this hierarchy will be used as a base when creating a +new record (res.partner for example).
      8. +
      +
      +
      +

      Usage

      +

      #. Go to the form view of an existing employee and click on the +“Documents” tab icon, a hierarchy of folders and files linked to that +record will be created. #. Create a new employee. A hierarchy of folders +and files linked to that record will be created.

      +
      +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Tecnativa
      • +
      +
      +
      +

      Contributors

      +
        +
      • Tecnativa:
          +
        • Víctor Martínez
        • +
        • Pedro M. Baeza
        • +
        +
      • +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      Current maintainer:

      +

      victoralmau

      +

      This module is part of the OCA/dms project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      + + diff --git a/hr_dms_field/static/src/js/base/dms_list_controller.esm.js b/hr_dms_field/static/src/js/base/dms_list_controller.esm.js new file mode 100644 index 000000000..8526c937d --- /dev/null +++ b/hr_dms_field/static/src/js/base/dms_list_controller.esm.js @@ -0,0 +1,20 @@ +import {DmsListController} from "@dms_field/views/dms_list/dms_list_controller.esm"; +import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; +import {patch} from "@web/core/utils/patch"; + +function getSanitizeDMSModel() { + return { + // A basic user does not have access to hr.employee, only to hr.employee.public + // (Employee Directory), we have to get the data from hr.employee because that + // is where it is actually linked. + sanitizeDMSModel(model) { + if (model === "hr.employee.public") { + return "hr.employee"; + } + return super.sanitizeDMSModel(...arguments); + }, + }; +} + +patch(DmsListController.prototype, getSanitizeDMSModel()); +patch(X2ManyField.prototype, getSanitizeDMSModel()); diff --git a/hr_dms_field/tests/__init__.py b/hr_dms_field/tests/__init__.py new file mode 100644 index 000000000..788e27983 --- /dev/null +++ b/hr_dms_field/tests/__init__.py @@ -0,0 +1 @@ +from . import test_hr_dms_field diff --git a/hr_dms_field/tests/test_hr_dms_field.py b/hr_dms_field/tests/test_hr_dms_field.py new file mode 100644 index 000000000..b3ee8a17b --- /dev/null +++ b/hr_dms_field/tests/test_hr_dms_field.py @@ -0,0 +1,113 @@ +# Copyright 2024-2025 Tecnativa - Víctor Martínez +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). +from odoo import Command +from odoo.tests import new_test_user +from odoo.tools import mute_logger + +from odoo.addons.base.tests.common import BaseCommon + + +class TestHrDmsField(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, test_dms_field=True)) + cls.template = cls.env.ref("hr_dms_field.field_template_employee") + cls.storage = cls.template.storage_id + cls.access_group = cls.template.group_ids + cls.env["dms.directory"].create( + { + "name": "Payrolls", + "parent_id": cls.template.dms_directory_ids[0].id, + "storage_id": cls.template.storage_id.id, + } + ) + cls.env["dms.directory"].create( + { + "name": "Contracts", + "parent_id": cls.template.dms_directory_ids[0].id, + "storage_id": cls.template.storage_id.id, + } + ) + cls.user = new_test_user(cls.env, login="test-user") + cls.employee_model = cls.env["hr.employee"] + + def test_employee_exists(self): + employee = self.employee_model.search([], limit=1) + self.assertEqual(len(employee.dms_directory_ids), 0) + + def test_employee_create_01(self): + employee = self.employee_model.create({"name": "Test employee"}) + # Manually refresh, similar to UX + # dms_field/static/src/views/dms_list/dms_list_renderer.esm.js#L450 + employee.invalidate_model() + directory = employee.dms_directory_ids + self.assertEqual(len(directory), 1) + self.assertEqual(directory.storage_id, self.storage) + group_custom = directory.group_ids.filtered("dms_field_ref") + self.assertIn(self.access_group, directory.group_ids) + self.assertNotIn(self.user, group_custom.explicit_user_ids) + child_directory_names = directory.mapped("child_directory_ids.name") + self.assertIn("Payrolls", child_directory_names) + self.assertIn("Contracts", child_directory_names) + + def test_employee_create_02(self): + employee = self.employee_model.create( + { + "name": "Test employee", + "user_id": self.user.id, + } + ) + # Manually refresh, similar to UX + # dms_field/static/src/views/dms_list/dms_list_renderer.esm.js#L450 + employee.invalidate_model() + group_custom = employee.dms_directory_ids.group_ids.filtered("dms_field_ref") + self.assertIn(self.user, group_custom.explicit_user_ids) + + def test_employee_write_custom(self): + read_access_hr_employee_group = self.env.ref( + "hr_dms_field.read_access_hr_employee_group" + ) + read_access_hr_employee_group.write( + { + "group_ids": [Command.set([])], + "explicit_user_ids": [Command.set(self.env.ref("base.user_admin").ids)], + } + ) + employee = self.employee_model.create({"name": "Test employee"}) + employee.invalidate_recordset() + directory = employee.dms_directory_ids + self.assertEqual(len(directory), 1) + directory_0 = employee.dms_directory_ids[0] + group_custom = directory_0.group_ids.filtered("dms_field_ref") + self.assertFalse(group_custom.explicit_user_ids) + # Use the demo user to modify the employee and link the user, it does not + # have access to the directory. + demo = self.env.ref("base.user_demo") + demo.write({"groups_id": [Command.link(self.env.ref("hr.group_hr_user").id)]}) + employee = employee.with_user(demo) + employee.invalidate_recordset() + employee.write({"user_id": self.user.id}) + self.assertIn(self.user, group_custom.explicit_user_ids) + + @mute_logger("odoo.models.unlink") + def test_employee_full_process(self): + employee = self.employee_model.create( + { + "name": "Test employee", + "user_id": self.user.id, + } + ) + # Manually refresh, similar to UX + # dms_field/static/src/views/dms_list/dms_list_renderer.esm.js#L450 + employee.invalidate_model() + directory_0 = employee.dms_directory_ids[0] + group_custom = directory_0.group_ids.filtered("dms_field_ref") + self.assertIn(self.user, group_custom.explicit_user_ids) + employee.write({"user_id": False}) + self.assertFalse(group_custom.explicit_user_ids) + employee.write({"user_id": self.user.id}) + self.assertIn(self.user, group_custom.explicit_user_ids) + employee.unlink() + self.assertFalse(directory_0.exists()) + self.assertFalse(group_custom.exists()) diff --git a/hr_dms_field/views/hr_employee_view.xml b/hr_dms_field/views/hr_employee_view.xml new file mode 100644 index 000000000..edb4cdbb3 --- /dev/null +++ b/hr_dms_field/views/hr_employee_view.xml @@ -0,0 +1,40 @@ + + + + hr.employee.form + hr.employee + + + + + + + + + + + hr.employee.public.form + hr.employee.public + + + + + + + + + + + + + + diff --git a/hr_dms_field/views/res_config_settings_view.xml b/hr_dms_field/views/res_config_settings_view.xml new file mode 100644 index 000000000..1d7e9b172 --- /dev/null +++ b/hr_dms_field/views/res_config_settings_view.xml @@ -0,0 +1,27 @@ + + + + res.config.settings.view.form.inherit.hr + res.config.settings + + + + +
      +
      + +
      +
      +
      +
      +
      +
      +
      +
      diff --git a/setup/_metapackage/pyproject.toml b/setup/_metapackage/pyproject.toml new file mode 100644 index 000000000..bdc0645f8 --- /dev/null +++ b/setup/_metapackage/pyproject.toml @@ -0,0 +1,17 @@ +[project] +name = "odoo-addons-oca-dms" +version = "18.0.20250811.0" +dependencies = [ + "odoo-addon-dms==18.0.*", + "odoo-addon-dms_auto_classification==18.0.*", + "odoo-addon-dms_field==18.0.*", + "odoo-addon-dms_field_auto_classification==18.0.*", + "odoo-addon-dms_user_role==18.0.*", + "odoo-addon-hr_dms_field==18.0.*", + "odoo-addon-web_editor_media_dialog_dms==18.0.*", +] +classifiers=[ + "Programming Language :: Python", + "Framework :: Odoo", + "Framework :: Odoo :: 18.0", +] diff --git a/web_editor_media_dialog_dms/README.rst b/web_editor_media_dialog_dms/README.rst new file mode 100644 index 000000000..92cb672dd --- /dev/null +++ b/web_editor_media_dialog_dms/README.rst @@ -0,0 +1,102 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +=========================== +Web Editor Media Dialog DMS +=========================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:69ef360f611a9faaf1e4bb82d63b18c7a0b57133c2a7057ab6b2ef0309333755 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fdms-lightgray.png?logo=github + :target: https://github.com/OCA/dms/tree/18.0/web_editor_media_dialog_dms + :alt: OCA/dms +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/dms-18-0/dms-18-0-web_editor_media_dialog_dms + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/dms&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds the option in the web editor to include an image with +the corresponding link to open/download the linked files. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, we need: + +1. Navigate to a model that has an HTML field +2. Edit the field +3. Type /image to open the media dialog +4. Select the DMS tab +5. Select the DMS file to be added + +You can also edit the selected file making a double click on the image +added to web editor. + +If you want to share the file to a public user, you can do it by +selecting the option **Allow open to public users** which is located on +DMS tab of media dialog. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* Tecnativa + +Contributors +------------ + +- `Tecnativa `__: + + - Pedro M. Baeza + - Carlos Roca + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/dms `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_editor_media_dialog_dms/__init__.py b/web_editor_media_dialog_dms/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/web_editor_media_dialog_dms/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_editor_media_dialog_dms/__manifest__.py b/web_editor_media_dialog_dms/__manifest__.py new file mode 100644 index 000000000..e6ed76560 --- /dev/null +++ b/web_editor_media_dialog_dms/__manifest__.py @@ -0,0 +1,17 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Web Editor Media Dialog DMS", + "summary": "Integrate DMS with media dialog of web editor", + "version": "18.0.1.0.1", + "license": "AGPL-3", + "author": "Tecnativa, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/dms", + "depends": ["dms", "web_editor"], + "assets": { + "html_editor.assets_media_dialog": [ + "web_editor_media_dialog_dms/static/src/media_dialog/*", + ] + }, +} diff --git a/web_editor_media_dialog_dms/i18n/es.po b/web_editor_media_dialog_dms/i18n/es.po new file mode 100644 index 000000000..e863a1cad --- /dev/null +++ b/web_editor_media_dialog_dms/i18n/es.po @@ -0,0 +1,70 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_media_dialog_dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-08-22 09:04+0000\n" +"PO-Revision-Date: 2024-08-22 11:05+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "All DMS files have been loaded" +msgstr "Todos los archivos DMS han sido cargados" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "Allow open to public users" +msgstr "Permitir abrir enlace a usuarios públicos" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file +msgid "File" +msgstr "Archivo" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "Modelo de ayuda para la transmisión de archivos para controladores" + +#. module: web_editor_media_dialog_dms +#. odoo-python +#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0 +#, python-format +msgid "Invalid access token" +msgstr "Token de acceso inválido" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "Load more..." +msgstr "Cargar más..." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "No DMS files found." +msgstr "No se encontraron archivos DMS." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0 +#, python-format +msgid "Search a dms file" +msgstr "Buscar un archivo DMS" diff --git a/web_editor_media_dialog_dms/i18n/it.po b/web_editor_media_dialog_dms/i18n/it.po new file mode 100644 index 000000000..71ed9b62f --- /dev/null +++ b/web_editor_media_dialog_dms/i18n/it.po @@ -0,0 +1,69 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_media_dialog_dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-08-29 13:06+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.6.2\n" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "All DMS files have been loaded" +msgstr "Tutti i file DMS sono stati caricati" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "Allow open to public users" +msgstr "Consenti l'apertura a utenti pubblici" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file +msgid "File" +msgstr "File" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "Modello aiuto streaming file per controller" + +#. module: web_editor_media_dialog_dms +#. odoo-python +#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0 +#, python-format +msgid "Invalid access token" +msgstr "Token accesso non valido" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "Load more..." +msgstr "Carica altri..." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +#, python-format +msgid "No DMS files found." +msgstr "Nessun file DMS trovato." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0 +#, python-format +msgid "Search a dms file" +msgstr "Cerca un file DMS" diff --git a/web_editor_media_dialog_dms/i18n/sv.po b/web_editor_media_dialog_dms/i18n/sv.po new file mode 100644 index 000000000..73eb5d6d5 --- /dev/null +++ b/web_editor_media_dialog_dms/i18n/sv.po @@ -0,0 +1,63 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_media_dialog_dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-09-19 13:34+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.4\n" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "All DMS files have been loaded" +msgstr "Alla DMS-filer har laddats" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "Allow open to public users" +msgstr "Tillåt öppen för offentliga användare" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file +msgid "File" +msgstr "Fil" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "Hjälpmodell för filströmning för styrenheter" + +#. module: web_editor_media_dialog_dms +#. odoo-python +#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0 +msgid "Invalid access token" +msgstr "Ogiltig åtkomsttoken" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "Load more..." +msgstr "Ladda mer..." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "No DMS files found." +msgstr "Inga DMS-filer hittade." + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0 +msgid "Search a dms file" +msgstr "Sök i en dms-fil" diff --git a/web_editor_media_dialog_dms/i18n/web_editor_media_dialog_dms.pot b/web_editor_media_dialog_dms/i18n/web_editor_media_dialog_dms.pot new file mode 100644 index 000000000..39e3ef22c --- /dev/null +++ b/web_editor_media_dialog_dms/i18n/web_editor_media_dialog_dms.pot @@ -0,0 +1,60 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_editor_media_dialog_dms +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "All DMS files have been loaded" +msgstr "" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "Allow open to public users" +msgstr "" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_dms_file +msgid "File" +msgstr "" + +#. module: web_editor_media_dialog_dms +#: model:ir.model,name:web_editor_media_dialog_dms.model_ir_binary +msgid "File streaming helper model for controllers" +msgstr "" + +#. module: web_editor_media_dialog_dms +#. odoo-python +#: code:addons/web_editor_media_dialog_dms/models/dms_file.py:0 +msgid "Invalid access token" +msgstr "" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "Load more..." +msgstr "" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml:0 +msgid "No DMS files found." +msgstr "" + +#. module: web_editor_media_dialog_dms +#. odoo-javascript +#: code:addons/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js:0 +msgid "Search a dms file" +msgstr "" diff --git a/web_editor_media_dialog_dms/models/__init__.py b/web_editor_media_dialog_dms/models/__init__.py new file mode 100644 index 000000000..078d8008c --- /dev/null +++ b/web_editor_media_dialog_dms/models/__init__.py @@ -0,0 +1,2 @@ +from . import dms_file +from . import ir_binary diff --git a/web_editor_media_dialog_dms/models/dms_file.py b/web_editor_media_dialog_dms/models/dms_file.py new file mode 100644 index 000000000..3b6d4447a --- /dev/null +++ b/web_editor_media_dialog_dms/models/dms_file.py @@ -0,0 +1,26 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import _, models +from odoo.exceptions import AccessError +from odoo.tools import consteq + + +class File(models.Model): + _inherit = "dms.file" + + def get_access_token(self): + self.ensure_one() + return self._portal_ensure_token() + + def validate_access(self, access_token): + # Validate if token provided is correct for the record checked + self.ensure_one() + record_sudo = self.sudo() + if access_token: + tok = record_sudo.with_context(prefetch_fields=False).access_token + valid_token = consteq(tok or "", access_token) + if not valid_token: + raise AccessError(_("Invalid access token")) + return record_sudo + return self diff --git a/web_editor_media_dialog_dms/models/ir_binary.py b/web_editor_media_dialog_dms/models/ir_binary.py new file mode 100644 index 000000000..b02c9b8b0 --- /dev/null +++ b/web_editor_media_dialog_dms/models/ir_binary.py @@ -0,0 +1,15 @@ +# Copyright 2024 Tecnativa - Carlos Roca +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). + +from odoo import models + + +class IrBinary(models.AbstractModel): + _inherit = "ir.binary" + + def _find_record_check_access(self, record, access_token, field=None): + # The method is overridden to allow access to the media attached to the + # dms.file records using an access_token. + if record._name == "dms.file": + return record.validate_access(access_token) + return super()._find_record_check_access(record, access_token, field=field) diff --git a/web_editor_media_dialog_dms/pyproject.toml b/web_editor_media_dialog_dms/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/web_editor_media_dialog_dms/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/web_editor_media_dialog_dms/readme/CONTRIBUTORS.md b/web_editor_media_dialog_dms/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..b7d9c3bac --- /dev/null +++ b/web_editor_media_dialog_dms/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Tecnativa](https://www.tecnativa.com): + - Pedro M. Baeza + - Carlos Roca diff --git a/web_editor_media_dialog_dms/readme/DESCRIPTION.md b/web_editor_media_dialog_dms/readme/DESCRIPTION.md new file mode 100644 index 000000000..86fd851a3 --- /dev/null +++ b/web_editor_media_dialog_dms/readme/DESCRIPTION.md @@ -0,0 +1,2 @@ +This module adds the option in the web editor to include an image with +the corresponding link to open/download the linked files. diff --git a/web_editor_media_dialog_dms/readme/USAGE.md b/web_editor_media_dialog_dms/readme/USAGE.md new file mode 100644 index 000000000..c1dd572c5 --- /dev/null +++ b/web_editor_media_dialog_dms/readme/USAGE.md @@ -0,0 +1,14 @@ +To use this module, we need: + +1. Navigate to a model that has an HTML field +2. Edit the field +3. Type /image to open the media dialog +4. Select the DMS tab +5. Select the DMS file to be added + +You can also edit the selected file making a double click on the image +added to web editor. + +If you want to share the file to a public user, you can do it by +selecting the option **Allow open to public users** which is located on +DMS tab of media dialog. diff --git a/web_editor_media_dialog_dms/static/description/icon.png b/web_editor_media_dialog_dms/static/description/icon.png new file mode 100644 index 000000000..3a0328b51 Binary files /dev/null and b/web_editor_media_dialog_dms/static/description/icon.png differ diff --git a/web_editor_media_dialog_dms/static/description/index.html b/web_editor_media_dialog_dms/static/description/index.html new file mode 100644 index 000000000..7e9af0672 --- /dev/null +++ b/web_editor_media_dialog_dms/static/description/index.html @@ -0,0 +1,451 @@ + + + + + +README.rst + + + +
      + + + +Odoo Community Association + +
      +

      Web Editor Media Dialog DMS

      + +

      Beta License: AGPL-3 OCA/dms Translate me on Weblate Try me on Runboat

      +

      This module adds the option in the web editor to include an image with +the corresponding link to open/download the linked files.

      +

      Table of contents

      + +
      +

      Usage

      +

      To use this module, we need:

      +
        +
      1. Navigate to a model that has an HTML field
      2. +
      3. Edit the field
      4. +
      5. Type /image to open the media dialog
      6. +
      7. Select the DMS tab
      8. +
      9. Select the DMS file to be added
      10. +
      +

      You can also edit the selected file making a double click on the image +added to web editor.

      +

      If you want to share the file to a public user, you can do it by +selecting the option Allow open to public users which is located on +DMS tab of media dialog.

      +
      +
      +

      Bug Tracker

      +

      Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

      +

      Do not contact contributors directly about support or help with technical issues.

      +
      +
      +

      Credits

      +
      +

      Authors

      +
        +
      • Tecnativa
      • +
      +
      +
      +

      Contributors

      +
        +
      • Tecnativa:
          +
        • Pedro M. Baeza
        • +
        • Carlos Roca
        • +
        +
      • +
      +
      +
      +

      Maintainers

      +

      This module is maintained by the OCA.

      + +Odoo Community Association + +

      OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

      +

      This module is part of the OCA/dms project on GitHub.

      +

      You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

      +
      +
      +
      +
      + + diff --git a/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js b/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js new file mode 100644 index 000000000..f2d100d4b --- /dev/null +++ b/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.esm.js @@ -0,0 +1,205 @@ +/* Copyright 2025 Carlos Roca - Tecnativa + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {Component, onWillStart, useRef, useState} from "@odoo/owl"; +import {KeepLast} from "@web/core/utils/concurrency"; +import {SearchMedia} from "@web_editor/components/media_dialog/search_media"; +import {_t} from "@web/core/l10n/translation"; +import {useDebounced} from "@web/core/utils/timing"; +import {useService} from "@web/core/utils/hooks"; + +export class DMSFile extends Component {} +DMSFile.template = "web_editor_media_dialog_dms.DMSFile"; + +export class DMSSelector extends Component { + setup() { + this.orm = useService("orm"); + this.keepLast = new KeepLast(); + this.loadMoreButtonRef = useRef("load-more-button"); + this.state = useState({ + dmsFiles: [], + canLoadMoreFiles: true, + isFetchingFiles: false, + needle: "", + }); + this.allowOpenPublic = false; + this.NUMBER_OF_FILES_TO_DISPLAY = 30; + this.searchPlaceholder = _t("Search a dms file"); + onWillStart(async () => { + this.state.dmsFiles = await this.fetchFiles( + this.NUMBER_OF_FILES_TO_DISPLAY, + 0 + ); + }); + this.debouncedScroll = useDebounced(this.scrollToLoadMoreButton, 500); + } + + get canLoadMore() { + return this.state.canLoadMoreFiles; + } + + get hasContent() { + return this.state.dmsFiles.length; + } + + get isFetching() { + return this.state.isFetchingFiles; + } + + get selectedFileIds() { + return this.props.selectedMedia[this.props.id] + .filter((media) => media.mediaType === "dms") + .map(({id}) => id); + } + + async fetchFiles(limit, offset) { + this.state.isFetchingFiles = true; + let files = []; + try { + files = await this.orm.searchRead( + "dms.file", + [["name", "ilike", this.state.needle]], + ["name", "mimetype"], + { + order: "id desc", + limit, + offset, + } + ); + } catch (e) { + if (e.exceptionName !== "odoo.exceptions.AccessError") { + throw e; + } + } + this.state.canLoadMoreFiles = files.length >= this.NUMBER_OF_FILES_TO_DISPLAY; + this.state.isFetchingFiles = false; + if (this.selectInitialMedia()) { + for (const file of files) { + if ( + `/mail/view?model=dms.file&res_id=${file.id}` === + this.props.media.getAttribute("href").replace(/[?].*/, "") + ) { + this.selectFile(file); + } + } + } + for (const file of files) { + file.allowOpenPublic = this.allowOpenPublic; + } + return files; + } + + async handleLoadMore() { + await this.loadMore(); + this.debouncedScroll(); + } + + async loadMore() { + return this.keepLast + .add( + this.fetchFiles( + this.NUMBER_OF_FILES_TO_DISPLAY, + this.state.dmsFiles.length + ) + ) + .then((newFiles) => { + // This is never reached if another search or loadMore occurred. + this.state.dmsFiles.push(...newFiles); + }); + } + + async handleSearch(needle) { + await this.search(needle); + this.debouncedScroll(); + } + + search(needle) { + this.state.dmsFiles = []; + this.state.needle = needle; + return this.keepLast + .add(this.fetchFiles(this.NUMBER_OF_FILES_TO_DISPLAY, 0)) + .then((files) => { + this.state.dmsFiles = files; + }); + } + + scrollToLoadMoreButton() { + if ( + this.state.needle || + this.state.dmsFiles.length > this.NUMBER_OF_FILES_TO_DISPLAY + ) { + this.loadMoreButtonRef.el.scrollIntoView({ + block: "end", + inline: "nearest", + behavior: "smooth", + }); + } + } + + async onClickFile(file) { + this.props.selectMedia({...file, mediaType: "dms"}); + await this.props.save(); + } + + static async createElements(selectedMedia, {orm}) { + return Promise.all( + selectedMedia.map(async (file) => { + const linkEl = document.createElement("a"); + let href = `/mail/view?model=dms.file&res_id=${encodeURIComponent( + file.id + )}`; + // Download svg images because are considered images but are not + // visualized correctly on new tab. Other files than pdf or image are + // downloaded by default + if (file.mimetype === "image/svg+xml") { + href += "&download=true"; + } + if (file.allowOpenPublic) { + const accessToken = await orm.call("dms.file", "get_access_token", [ + file.id, + ]); + href += `&access_token=${encodeURIComponent(accessToken)}`; + } + linkEl.href = href; + linkEl.title = file.name; + linkEl.dataset.mimetype = file.mimetype; + return linkEl; + }) + ); + } + + selectFile(file) { + this.props.selectMedia({...file, mediaType: "dms"}); + } + + selectInitialMedia() { + return ( + this.props.media && + this.constructor.tagNames.includes(this.props.media.tagName) && + !this.selectedFileIds.length + ); + } + + async handleChangeAllowOpenPublic() { + await this.changeAllowOpenPublic(); + this.debouncedScroll(); + } + + changeAllowOpenPublic() { + this.allowOpenPublic = !this.allowOpenPublic; + return this.keepLast + .add(this.fetchFiles(this.state.dmsFiles.length, 0)) + .then((files) => { + this.state.dmsFiles = files; + }); + } +} + +DMSSelector.template = "web_editor_media_dialog_dms.DMSSelector"; +DMSSelector.mediaSpecificClasses = ["o_image", "o_dms_file"]; +DMSSelector.mediaSpecificStyles = []; +DMSSelector.mediaExtraClasses = []; +DMSSelector.tagNames = ["A"]; +DMSSelector.components = { + DMSFile, + SearchMedia, +}; diff --git a/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml b/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml new file mode 100644 index 000000000..9b63ef482 --- /dev/null +++ b/web_editor_media_dialog_dms/static/src/media_dialog/dms_selector.xml @@ -0,0 +1,77 @@ + + + +
      + + + +
      +
      + +
      +
      + + +
      +
      +
      +
      +

      No DMS files found.

      +
      +
      + + + +
      +
      + +
      + + All DMS files have been loaded + +
      +
      +
      +
      + diff --git a/web_editor_media_dialog_dms/static/src/media_dialog/media_dialog.esm.js b/web_editor_media_dialog_dms/static/src/media_dialog/media_dialog.esm.js new file mode 100644 index 000000000..b61fb5c5e --- /dev/null +++ b/web_editor_media_dialog_dms/static/src/media_dialog/media_dialog.esm.js @@ -0,0 +1,43 @@ +/* Copyright 2025 Carlos Roca - Tecnativa + * License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl). */ +import {MediaDialog, TABS} from "@html_editor/main/media/media_dialog/media_dialog"; +import {DMSSelector} from "./dms_selector.esm"; +import {patch} from "@web/core/utils/patch"; + +patch(TABS, { + DMS: { + id: "DMS", + title: "DMS", + Component: DMSSelector, + }, +}); + +patch(MediaDialog.prototype, { + get initialActiveTab() { + const dmsTab = this.tabs.DMS; + if ( + !this.props.activeTab && + dmsTab && + this.props.media && + this.props.media.classList.contains("o_dms_file") + ) { + return dmsTab.id; + } + return super.initialActiveTab; + }, + addDefaultTabs() { + const res = super.addDefaultTabs(...arguments); + const onlyImages = + this.props.onlyImages || + this.props.multiImages || + (this.props.media && + this.props.media.parentElement && + (this.props.media.parentElement.dataset.oeField === "image" || + this.props.media.parentElement.dataset.oeType === "image")); + const noDMS = onlyImages || this.props.noDMS; + if (!noDMS) { + this.addTab(TABS.DMS); + } + return res; + }, +});