Full Code of OCA/knowledge for AI

18.0 fdd4836df6cc cached
713 files
5.8 MB
1.5M tokens
1392 symbols
1 requests
Download .txt
Showing preview only (6,206K chars total). Download the full file or copy to clipboard to get everything.
Repository: OCA/knowledge
Branch: 18.0
Commit: fdd4836df6cc
Files: 713
Total size: 5.8 MB

Directory structure:
gitextract_5g2yh69w/

├── .copier-answers.yml
├── .editorconfig
├── .github/
│   └── workflows/
│       ├── pre-commit.yml
│       ├── stale.yml
│       └── test.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc-mandatory
├── .ruff.toml
├── LICENSE
├── README.md
├── attachment_preview/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── attachment_preview.pot
│   │   ├── de.po
│   │   ├── es.po
│   │   ├── gl.po
│   │   ├── it.po
│   │   ├── nl.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── sl.po
│   │   ├── tr.po
│   │   ├── vi_VN.po
│   │   └── zh_CN.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── ir_attachment.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   ├── lib/
│   │   │   └── ViewerJS/
│   │   │       ├── compatibility.js
│   │   │       ├── example.local.css
│   │   │       ├── index.html
│   │   │       ├── pdf.js
│   │   │       ├── pdf.worker.js
│   │   │       ├── pdfjsversion.js
│   │   │       ├── text_layer_builder.js
│   │   │       ├── ui_utils.js
│   │   │       └── webodf.js
│   │   └── src/
│   │       ├── js/
│   │       │   ├── attachmentPreviewWidget.esm.js
│   │       │   ├── mail_core/
│   │       │   │   └── attachment_list.esm.js
│   │       │   ├── utils.esm.js
│   │       │   ├── viewerjs_tweaks.js
│   │       │   └── web_views/
│   │       │       ├── fields/
│   │       │       │   └── binary_field.esm.js
│   │       │       └── form/
│   │       │           ├── form_compiler.esm.js
│   │       │           ├── form_controller.esm.js
│   │       │           └── form_renderer.esm.js
│   │       ├── scss/
│   │       │   └── attachment_preview.scss
│   │       └── xml/
│   │           └── attachment_preview.xml
│   └── tests/
│       ├── __init__.py
│       └── test_attachment_preview.py
├── attachment_zipped_download/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── i18n/
│   │   ├── attachment_zipped_download.pot
│   │   ├── es.po
│   │   ├── fr.po
│   │   ├── gl.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   ├── pt.po
│   │   └── pt_BR.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── ir_attachment.py
│   │   └── ir_attachment_action_download.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   └── res_partner.py
│   │   ├── test_attachment_zipped_download.py
│   │   └── test_ir_attachment_action_download.py
│   └── views/
│       └── ir_attachment_view.xml
├── checklog-odoo.cfg
├── document_knowledge/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── data/
│   │   ├── ir_module_category.xml
│   │   └── res_users.xml
│   ├── demo/
│   │   └── document_knowledge.xml
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_knowledge.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── he_IL.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── knowledge.pot
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── ir_attachment.py
│   │   └── res_config.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── CREDITS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── document_knowledge_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   └── views/
│       ├── document_knowledge.xml
│       └── res_config.xml
├── document_page/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── demo/
│   │   └── document_page.xml
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── he_IL.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sq.po
│   │   ├── sr.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tlh.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   ├── document_page_history.py
│   │   └── ir_ui_menu.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── CREDITS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── security/
│   │   ├── document_page_security.xml
│   │   └── ir.model.access.csv
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       ├── js/
│   │       │   ├── document_page_kanban_controller.esm.js
│   │       │   └── document_page_kanban_view.esm.js
│   │       └── scss/
│   │           ├── document_page.scss
│   │           └── document_page_variables.scss
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_document_page.py
│   │   ├── test_document_page_create_menu.py
│   │   ├── test_document_page_history.py
│   │   └── test_document_page_show_diff.py
│   ├── views/
│   │   ├── document_page.xml
│   │   ├── document_page_category.xml
│   │   ├── document_page_history.xml
│   │   └── report_document_page.xml
│   └── wizard/
│       ├── __init__.py
│       ├── document_page_create_menu.py
│       ├── document_page_create_menu.xml
│       ├── document_page_show_diff.py
│       └── document_page_show_diff.xml
├── document_page_access_group/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── ca.po
│   │   ├── document_page_access_group.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt_BR.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── common.py
│   │   └── test_document_page_access_group.py
│   └── views/
│       └── document_page.xml
├── document_page_access_group_user_role/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_access_group_user_role.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_access_group_user_role.py
│   └── views/
│       └── document_page_views.xml
├── document_page_approval/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── data/
│   │   └── email_template.xml
│   ├── hooks.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page_approval.pot
│   │   ├── el.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── document_page_history.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── document_page_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_approval.py
│   └── views/
│       └── document_page_approval.xml
├── document_page_group/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── ca.po
│   │   ├── document_page_group.pot
│   │   ├── es.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   ├── pt.po
│   │   └── sl.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   └── DESCRIPTION.md
│   ├── security/
│   │   └── document_page_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_group.py
│   └── views/
│       └── document_page.xml
├── document_page_partner/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── de.po
│   │   ├── document_page_partner.pot
│   │   ├── document_page_partner_id.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   └── views/
│       └── document_page.xml
├── document_page_product/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_product.pot
│   │   ├── es.po
│   │   └── it.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── product.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_product.py
│   └── views/
│       ├── document_page_views.xml
│       ├── product_product_views.xml
│       └── product_template_views.xml
├── document_page_project/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_project.pot
│   │   ├── es.po
│   │   ├── he_IL.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── project_project.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_project_project.py
│   └── views/
│       ├── document_page_views.xml
│       └── project_project_views.xml
├── document_page_project_task/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_project_task.pot
│   │   └── it.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── project_task.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_document_page.py
│   │   └── test_project_task.py
│   └── views/
│       ├── document_page_views.xml
│       └── project_task_views.xml
├── document_page_reference/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_reference.pot
│   │   ├── es.po
│   │   ├── gl.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── migrations/
│   │   └── 18.0.1.1.0/
│   │       └── post-migration.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       └── js/
│   │           └── editor.esm.js
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_reference.py
│   └── views/
│       ├── document_page.xml
│       └── report_document_page.xml
├── document_page_tag/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── ca_ES.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page_tag.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PE.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── fr_CH.po
│   │   ├── gl.po
│   │   ├── gl_ES.po
│   │   ├── he.po
│   │   ├── hr.po
│   │   ├── hr_HR.po
│   │   ├── hu.po
│   │   ├── id.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ko.po
│   │   ├── lt.po
│   │   ├── lt_LT.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nb_NO.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── tr_TR.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── vi_VN.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── document_page_tag.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── ir.model.access.csv
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_tag.py
│   └── views/
│       ├── document_page.xml
│       └── document_page_tag.xml
├── document_url/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_url.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── ir_attachment.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── ir.model.access.csv
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       ├── js/
│   │       │   └── url.esm.js
│   │       ├── scss/
│   │       │   └── document_url.scss
│   │       └── xml/
│   │           └── url.xml
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_url.py
│   ├── view/
│   │   └── document_url_view.xml
│   └── wizard/
│       ├── __init__.py
│       └── document_url.py
├── eslint.config.cjs
├── prettier.config.cjs
├── setup/
│   ├── _metapackage/
│   │   └── pyproject.toml
│   └── document_page_project_task/
│       └── setup.py
└── test-requirements.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .copier-answers.yml
================================================
# Do NOT update manually; changes here will be overwritten by Copier
_commit: v1.29
_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: 18.0
org_name: Odoo Community Association (OCA)
org_slug: OCA
rebel_module_groups: []
repo_description: knowledge
repo_name: knowledge
repo_slug: knowledge
repo_website: https://github.com/OCA/knowledge
use_pyproject_toml: true
use_ruff: true



================================================
FILE: .editorconfig
================================================
# Configuration for known file extensions
[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.{json,yml,yaml,rst,md}]
indent_size = 2

# Do not configure editor for libs and autogenerated content
[{*/static/{lib,src/lib}/**,*/static/description/index.html,*/readme/../README.rst}]
charset = unset
end_of_line = unset
indent_size = unset
indent_style = unset
insert_final_newline = false
trim_trailing_whitespace = false


================================================
FILE: .github/workflows/pre-commit.yml
================================================
name: pre-commit

on:
  pull_request:
    branches:
      - "18.0*"
  push:
    branches:
      - "18.0"
      - "18.0-ocabot-*"

jobs:
  pre-commit:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: "3.11"
      - name: Get python version
        run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
      - uses: actions/cache@v4
        with:
          path: ~/.cache/pre-commit
          key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
      - name: Install pre-commit
        run: pip install pre-commit
      - name: Run pre-commit
        run: pre-commit run --all-files --show-diff-on-failure --color=always
        env:
          # Consider valid a PR that changes README fragments but doesn't
          # change the README.rst file itself. It's not really a problem
          # because the bot will update it anyway after merge. This way, we
          # lower the barrier for functional contributors that want to fix the
          # readme fragments, while still letting developers get README
          # auto-generated (which also helps functionals when using runboat).
          # DOCS https://pre-commit.com/#temporarily-disabling-hooks
          SKIP: oca-gen-addon-readme
      - name: Check that all files generated by pre-commit are in git
        run: |
          newfiles="$(git ls-files --others --exclude-from=.gitignore)"
          if [ "$newfiles" != "" ] ; then
              echo "Please check-in the following files:"
              echo "$newfiles"
              exit 1
          fi


================================================
FILE: .github/workflows/stale.yml
================================================
name: Mark stale issues and pull requests

on:
  schedule:
    - cron: "0 12 * * 0"

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - name: Stale PRs and issues policy
        uses: actions/stale@v9
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          # General settings.
          ascending: true
          remove-stale-when-updated: true
          # Pull Requests settings.
          # 120+30 day stale policy for PRs
          # * Except PRs marked as "no stale"
          days-before-pr-stale: 120
          days-before-pr-close: 30
          exempt-pr-labels: "no stale"
          stale-pr-label: "stale"
          stale-pr-message: >
            There hasn't been any activity on this pull request in the past 4 months, so
            it has been marked as stale and it will be closed automatically if no
            further activity occurs in the next 30 days.

            If you want this PR to never become stale, please ask a PSC member to apply
            the "no stale" label.
          # Issues settings.
          # 180+30 day stale policy for open issues
          # * Except Issues marked as "no stale"
          days-before-issue-stale: 180
          days-before-issue-close: 30
          exempt-issue-labels: "no stale,needs more information"
          stale-issue-label: "stale"
          stale-issue-message: >
            There hasn't been any activity on this issue in the past 6 months, so it has
            been marked as stale and it will be closed automatically if no further
            activity occurs in the next 30 days.

            If you want this issue to never become stale, please ask a PSC member to
            apply the "no stale" label.

      # 15+30 day stale policy for issues pending more information
      # * Issues that are pending more information
      # * Except Issues marked as "no stale"
      - name: Needs more information stale issues policy
        uses: actions/stale@v9
        with:
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          ascending: true
          only-labels: "needs more information"
          exempt-issue-labels: "no stale"
          days-before-stale: 15
          days-before-close: 30
          days-before-pr-stale: -1
          days-before-pr-close: -1
          remove-stale-when-updated: true
          stale-issue-label: "stale"
          stale-issue-message: >
            This issue needs more information and there hasn't been any activity
            recently, so it has been marked as stale and it will be closed automatically
            if no further activity occurs in the next 30 days.

            If you think this is a mistake, please ask a PSC member to remove the "needs
            more information" label.


================================================
FILE: .github/workflows/test.yml
================================================
name: tests

on:
  pull_request:
    branches:
      - "18.0*"
  push:
    branches:
      - "18.0"
      - "18.0-ocabot-*"

jobs:
  unreleased-deps:
    runs-on: ubuntu-latest
    name: Detect unreleased dependencies
    steps:
      - uses: actions/checkout@v4
      - run: |
          for reqfile in requirements.txt test-requirements.txt ; do
              if [ -f ${reqfile} ] ; then
                  result=0
                  # reject non-comment lines that contain a / (i.e. URLs, relative paths)
                  grep "^[^#].*/" ${reqfile} || result=$?
                  if [ $result -eq 0 ] ; then
                      echo "Unreleased dependencies found in ${reqfile}."
                      exit 1
                  fi
              fi
          done
  test:
    runs-on: ubuntu-22.04
    container: ${{ matrix.container }}
    name: ${{ matrix.name }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - container: ghcr.io/oca/oca-ci/py3.10-odoo18.0:latest
            name: test with Odoo
          - container: ghcr.io/oca/oca-ci/py3.10-ocb18.0:latest
            name: test with OCB
            makepot: "true"
    services:
      postgres:
        image: postgres:12.0
        env:
          POSTGRES_USER: odoo
          POSTGRES_PASSWORD: odoo
          POSTGRES_DB: odoo
        ports:
          - 5432:5432
    env:
      OCA_ENABLE_CHECKLOG_ODOO: "1"
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
      - name: Install addons and dependencies
        run: oca_install_addons
      - name: Check licenses
        run: manifestoo -d . check-licenses
      - name: Check development status
        run: manifestoo -d . check-dev-status --default-dev-status=Beta
      - name: Initialize test db
        run: oca_init_test_database
      - name: Run tests
        run: oca_run_tests
      - uses: codecov/codecov-action@v4
        with:
          token: ${{ secrets.CODECOV_TOKEN }}
      - name: Update .pot files
        run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }}
        if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'OCA' }}


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
/.venv
/.pytest_cache
/.ruff_cache

# C extensions
*.so

# Distribution / packaging
.Python
env/
bin/
build/
develop-eggs/
dist/
eggs/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
*.eggs

# Windows installers
*.msi

# Debian packages
*.deb

# Redhat packages
*.rpm

# MacOS packages
*.dmg
*.pkg

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml

# Translations
*.mo

# Pycharm
.idea

# Eclipse
.settings

# Visual Studio cache/options directory
.vs/
.vscode

# OSX Files
.DS_Store

# Django stuff:
*.log

# Mr Developer
.mr.developer.cfg
.project
.pydevproject

# Rope
.ropeproject

# Sphinx documentation
docs/_build/

# Backup files
*~
*.swp

# OCA rules
!static/lib/


================================================
FILE: .pre-commit-config.yaml
================================================
exclude: |
  (?x)
  # NOT INSTALLABLE ADDONS
  # END NOT INSTALLABLE ADDONS
  # Files and folders generated by bots, to avoid loops
  ^setup/|/static/description/index\.html$|
  # We don't want to mess with tool-generated files
  .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|^eslint.config.cjs|^prettier.config.cjs|
  # Maybe reactivate this when all README files include prettier ignore tags?
  ^README\.md$|
  # Library files can have extraneous formatting (even minimized)
  /static/(src/)?lib/|
  # Repos using Sphinx to generate docs don't need prettying
  ^docs/_templates/.*\.html$|
  # Don't bother non-technical authors with formatting issues in docs
  readme/.*\.(rst|md)$|
  # Ignore build and dist directories in addons
  /build/|/dist/|
  # Ignore test files in addons
  /tests/samples/.*|
  # You don't usually want a bot to modify your legal texts
  (LICENSE.*|COPYING.*)
default_language_version:
  python: python3
  node: "22.9.0"
repos:
  - repo: local
    hooks:
      # These files are most likely copier diff rejection junks; if found,
      # review them manually, fix the problem (if needed) and remove them
      - id: forbidden-files
        name: forbidden files
        entry: found forbidden files; remove them
        language: fail
        files: "\\.rej$"
      - id: en-po-files
        name: en.po files cannot exist
        entry: found a en.po file
        language: fail
        files: '[a-zA-Z0-9_]*/i18n/en\.po$'
  - repo: https://github.com/sbidoul/whool
    rev: v1.2
    hooks:
      - id: whool-init
  - repo: https://github.com/oca/maintainer-tools
    rev: bf9ecb9938b6a5deca0ff3d870fbd3f33341fded
    hooks:
      # update the NOT INSTALLABLE ADDONS section above
      - id: oca-update-pre-commit-excluded-addons
      - id: oca-fix-manifest-website
        args: ["https://github.com/OCA/knowledge"]
      - id: oca-gen-addon-readme
        args:
          - --addons-dir=.
          - --branch=18.0
          - --org-name=OCA
          - --repo-name=knowledge
          - --if-source-changed
          - --keep-source-digest
          - --convert-fragments-to-markdown
      - id: oca-gen-external-dependencies
  - repo: https://github.com/OCA/odoo-pre-commit-hooks
    rev: v0.0.33
    hooks:
      - id: oca-checks-odoo-module
      - id: oca-checks-po
        args:
          - --disable=po-pretty-format
  - repo: local
    hooks:
      - id: prettier
        name: prettier (with plugin-xml)
        entry: prettier
        args:
          - --write
          - --list-different
          - --ignore-unknown
        types: [text]
        files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
        language: node
        additional_dependencies:
          - "prettier@3.3.3"
          - "@prettier/plugin-xml@3.4.1"
  - repo: local
    hooks:
      - id: eslint
        name: eslint
        entry: eslint
        args:
          - --color
          - --fix
        verbose: true
        types: [javascript]
        language: node
        additional_dependencies:
          - "eslint@9.12.0"
          - "eslint-plugin-jsdoc@50.3.1"
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.6.0
    hooks:
      - id: trailing-whitespace
        # exclude autogenerated files
        exclude: /README\.rst$|\.pot?$
      - id: end-of-file-fixer
        # 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
      - id: check-merge-conflict
        # exclude files where underlines are not distinguishable from merge conflicts
        exclude: /README\.rst$|^docs/.*\.rst$
      - id: check-symlinks
      - id: check-xml
      - id: mixed-line-ending
        args: ["--fix=lf"]
  - repo: https://github.com/astral-sh/ruff-pre-commit
    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.1.3
    hooks:
      - id: pylint_odoo
        name: pylint with optional checks
        args:
          - --rcfile=.pylintrc
          - --exit-zero
        verbose: true
      - id: pylint_odoo
        args:
          - --rcfile=.pylintrc-mandatory


================================================
FILE: .pylintrc
================================================


[MASTER]
load-plugins=pylint_odoo
score=n

[ODOOLINT]
readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
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=18.0

[MESSAGES CONTROL]
disable=all

# This .pylintrc contains optional AND mandatory checks and is meant to be
# loaded in an IDE to have it check everything, in the hope this will make
# optional checks more visible to contributors who otherwise never look at a
# green travis to see optional checks that failed.
# .pylintrc-mandatory containing only mandatory checks is used the pre-commit
# 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,
    manifest-required-author,
    manifest-required-key,
    manifest-version-format,
    method-compute,
    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,
    # messages that do not cause the lint step to fail
    consider-merging-classes-inherited,
    create-user-wo-reset-password,
    dangerous-filter-wo-user,
    deprecated-module,
    file-not-used,
    invalid-commit,
    missing-manifest-dependency,
    missing-newline-extrafiles,
    missing-readme,
    no-utf8-coding-comment,
    odoo-addons-relative-import,
    old-api7-method-defined,
    redefined-builtin,
    too-complex,
    unnecessary-utf8-coding-comment


[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no


================================================
FILE: .pylintrc-mandatory
================================================

[MASTER]
load-plugins=pylint_odoo
score=n

[ODOOLINT]
readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
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=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,
    manifest-required-author,
    manifest-required-key,
    manifest-version-format,
    method-compute,
    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

[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
reports=no


================================================
FILE: .ruff.toml
================================================

target-version = "py310"
fix = true

[lint]
extend-select = [
    "B",
    "C90",
    "E501",  # line too long (default 88)
    "I",  # isort
    "UP",  # pyupgrade
]
extend-safe-fixes = ["UP008"]
exclude = ["setup/*"]

[format]
exclude = ["setup/*"]

[lint.per-file-ignores]
"__init__.py" = ["F401", "I001"]  # ignore unused and unsorted imports in __init__.py
"__manifest__.py" = ["B018"]  # useless expression

[lint.isort]
section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"]

[lint.isort.sections]
"odoo" = ["odoo"]
"odoo-addons" = ["odoo.addons"]

[lint.mccabe]
max-complexity = 16


================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time.  Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.


================================================
FILE: README.md
================================================

[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/knowledge&target_branch=18.0)
[![Pre-commit Status](https://github.com/OCA/knowledge/actions/workflows/pre-commit.yml/badge.svg?branch=18.0)](https://github.com/OCA/knowledge/actions/workflows/pre-commit.yml?query=branch%3A18.0)
[![Build Status](https://github.com/OCA/knowledge/actions/workflows/test.yml/badge.svg?branch=18.0)](https://github.com/OCA/knowledge/actions/workflows/test.yml?query=branch%3A18.0)
[![codecov](https://codecov.io/gh/OCA/knowledge/branch/18.0/graph/badge.svg)](https://codecov.io/gh/OCA/knowledge)
[![Translation Status](https://translation.odoo-community.org/widgets/knowledge-18-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/knowledge-18-0/?utm_source=widget)

<!-- /!\ do not modify above this line -->

# knowledge

knowledge

<!-- /!\ do not modify below this line -->

<!-- prettier-ignore-start -->

[//]: # (addons)

Available addons
----------------
addon | version | maintainers | summary
--- | --- | --- | ---
[attachment_preview](attachment_preview/) | 18.0.1.0.0 |  | Preview attachments supported by Viewer.js
[attachment_zipped_download](attachment_zipped_download/) | 18.0.1.0.0 |  | Attachment Zipped Download
[document_knowledge](document_knowledge/) | 18.0.1.0.2 |  | Documents Knowledge
[document_page](document_page/) | 18.0.2.1.0 |  | Document Page
[document_page_access_group](document_page_access_group/) | 18.0.1.0.1 |  | Choose groups to access document pages
[document_page_access_group_user_role](document_page_access_group_user_role/) | 18.0.1.0.0 | <a href='https://github.com/victoralmau'><img src='https://github.com/victoralmau.png' width='32' height='32' style='border-radius:50%;' alt='victoralmau'/></a> | Document Page Access Group User Role
[document_page_approval](document_page_approval/) | 18.0.1.1.1 |  | Document Page Approval
[document_page_group](document_page_group/) | 18.0.1.0.0 |  | Define access groups on documents
[document_page_partner](document_page_partner/) | 18.0.1.0.0 |  | Allows to link doucment pages to a partner
[document_page_product](document_page_product/) | 18.0.1.0.0 | <a href='https://github.com/victoralmau'><img src='https://github.com/victoralmau.png' width='32' height='32' style='border-radius:50%;' alt='victoralmau'/></a> | This module links document pages to products
[document_page_project](document_page_project/) | 18.0.1.0.0 | <a href='https://github.com/LoisRForgeFlow'><img src='https://github.com/LoisRForgeFlow.png' width='32' height='32' style='border-radius:50%;' alt='LoisRForgeFlow'/></a> | This module links document pages to projects
[document_page_project_task](document_page_project_task/) | 18.0.2.0.0 | <a href='https://github.com/marcelsavegnago'><img src='https://github.com/marcelsavegnago.png' width='32' height='32' style='border-radius:50%;' alt='marcelsavegnago'/></a> | This module links document pages to project tasks
[document_page_reference](document_page_reference/) | 18.0.2.1.0 | <a href='https://github.com/etobella'><img src='https://github.com/etobella.png' width='32' height='32' style='border-radius:50%;' alt='etobella'/></a> | Include references on document pages
[document_page_tag](document_page_tag/) | 18.0.1.0.0 |  | Allows you to assign tags or keywords to pages and search for them afterwards
[document_url](document_url/) | 18.0.1.0.1 |  | URL attachment

[//]: # (end addons)

<!-- prettier-ignore-end -->

## Licenses

This repository is licensed under [AGPL-3.0](LICENSE).

However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA)
policy. Consult each module's `__manifest__.py` file, which contains a `license` key
that explains its license.

----
OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit
organization whose mission is to support the collaborative development of Odoo features
and promote its widespread use.


================================================
FILE: attachment_preview/README.rst
================================================
.. image:: https://odoo-community.org/readme-banner-image
   :target: https://odoo-community.org/get-involved?utm_source=readme
   :alt: Odoo Community Association

===================
Preview attachments
===================

.. 
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! This file is generated by oca-gen-addon-readme !!
   !! changes will be overwritten.                   !!
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !! source digest: sha256:e9abcd982f1b988dc4c79d2c451320fddb5fc1289f44e8b7c178c917b2bd4d1e
   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |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%2Fknowledge-lightgray.png?logo=github
    :target: https://github.com/OCA/knowledge/tree/18.0/attachment_preview
    :alt: OCA/knowledge
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
    :target: https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-attachment_preview
    :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/knowledge&target_branch=18.0
    :alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

This addon allows to preview attachments supported by
http://viewerjs.org.

Currently, that's most Libreoffice files and PDFs.

|Screenshot of split form view|

.. |Screenshot of split form view| image:: https://raw.githubusercontent.com/attachment_preview/static/description/screenshot-split.png

**Table of contents**

.. contents::
   :local:

Installation
============

For filetype recognition, you'll get the best results by installing
``python-magic``:

sudo apt-get install python-magic

Usage
=====

The module adds a little print preview icon right of download links for
attachments or binary fields. When a preview is opened from the
attachments menu it's shown next to the form view. From this screen you
can navigate through the attachments using the arrow buttons. Using the
pop-out button next to the navigational buttons you can open the preview
in a separate window.

|Screenshot navigator|

.. |Screenshot navigator| image:: https://raw.githubusercontent.com/attachment_preview/static/description/screenshot-paginator.png

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/knowledge/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 <https://github.com/OCA/knowledge/issues/new?body=module:%20attachment_preview%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

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

Credits
=======

Authors
-------

* Therp BV
* Onestein

Contributors
------------

- Holger Brunn <mail@hunki-enterprises.com>
- Dennis Sluijk <d.sluijk@onestein.nl>

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/knowledge <https://github.com/OCA/knowledge/tree/18.0/attachment_preview>`_ project on GitHub.

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


================================================
FILE: attachment_preview/__init__.py
================================================
# Copyright 2014 Therp BV (<http://therp.nl>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import models


================================================
FILE: attachment_preview/__manifest__.py
================================================
# Copyright 2014 Therp BV (<http://therp.nl>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{
    "name": "Preview attachments",
    "version": "18.0.1.0.0",
    "author": "Therp BV," "Onestein," "Odoo Community Association (OCA)",
    "website": "https://github.com/OCA/knowledge",
    "license": "AGPL-3",
    "summary": "Preview attachments supported by Viewer.js",
    "category": "Knowledge Management",
    "depends": ["web", "mail"],
    "data": [],
    "qweb": [],
    "assets": {
        "web._assets_primary_variables": [],
        "web.assets_backend": [
            "attachment_preview/static/src/js/attachmentPreviewWidget.esm.js",
            "attachment_preview/static/src/js/utils.esm.js",
            "attachment_preview/static/src/js/mail_core/attachment_list.esm.js",
            "attachment_preview/static/src/js/web_views/fields/binary_field.esm.js",
            "attachment_preview/static/src/js/web_views/form/form_compiler.esm.js",
            "attachment_preview/static/src/js/web_views/form/form_controller.esm.js",
            "attachment_preview/static/src/js/web_views/form/form_renderer.esm.js",
            "attachment_preview/static/src/scss/attachment_preview.scss",
            "attachment_preview/static/src/xml/attachment_preview.xml",
        ],
    },
    "installable": True,
}


================================================
FILE: attachment_preview/i18n/attachment_preview.pot
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
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: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/js/web_views/fields/binary_field.esm.js:0
msgid "Preview %s"
msgstr ""


================================================
FILE: attachment_preview/i18n/de.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-23 14:27+0000\n"
"PO-Revision-Date: 2022-08-23 14:27+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: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Dateianhang"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr "In neuer Seite öffnen"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr "Vorschau"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Vorschau %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/es.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
# Antonio Trueba, 2016
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-12-19 10:18+0000\n"
"PO-Revision-Date: 2026-04-19 09:18+0000\n"
"Last-Translator: Ed-Spain <eduamoros@gmail.com>\n"
"Language-Team: Spanish (http://www.transifex.com/oca/OCA-knowledge-8-0/"
"language/es/)\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.15.2\n"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Archivo adjunto"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr "Abrir en página nueva"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""
"Abrir vista previa {{attachmentCard.attachment.name}} en una nueva pestaña"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr "Vista previa"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Previsualizar %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""
"Vista previa de {{attachmentCard.attachment.displayName}} en panel lateral"


================================================
FILE: attachment_preview/i18n/gl.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2026-04-23 14:45+0000\n"
"Last-Translator: Marcos Chavarría Teijeiro <chavarria1991@gmail.com>\n"
"Language-Team: none\n"
"Language: gl\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.15.2\n"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Ficheiro Anexo"

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
msgid "Open in new page"
msgstr "Abrir nunha páxina nova"

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
msgid "Preview"
msgstr "Vista previa"

#. module: attachment_preview
#. odoo-javascript
#: code:addons/attachment_preview/static/src/js/web_views/fields/binary_field.esm.js:0
msgid "Preview %s"
msgstr "Previsualizar %s"


================================================
FILE: attachment_preview/i18n/it.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
# Paolo Valier, 2016
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-05 11:50+0000\n"
"PO-Revision-Date: 2026-01-10 10:42+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: Italian (http://www.transifex.com/oca/OCA-knowledge-8-0/"
"language/it/)\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: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Allegato"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr "Apri in una pagina nuova"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr "Apri anteprima {{attachmentCard.attachment.name}} in una nuova scheda"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr "Anteprima"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Anteprima %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""
"Anteprima {{attachmentCard.attachment.displayName}} nel pannello laterale"


================================================
FILE: attachment_preview/i18n/nl.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-12-08 08:32+0000\n"
"PO-Revision-Date: 2015-11-07 12:44+0000\n"
"Last-Translator: OCA Transbot <transbot@odoo-community.org>\n"
"Language-Team: Dutch (http://www.transifex.com/oca/OCA-knowledge-8-0/"
"language/nl/)\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"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Voorbeeld %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/pt_BR.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
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: 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"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/pt_PT.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
# Pedro Castro Silva <pedrocs@sossia.pt>, 2016
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-05-07 16:07+0000\n"
"PO-Revision-Date: 2016-05-22 22:19+0000\n"
"Last-Translator: Pedro Castro Silva <pedrocs@sossia.pt>\n"
"Language-Team: Portuguese (Portugal) (http://www.transifex.com/oca/OCA-"
"knowledge-8-0/language/pt_PT/)\n"
"Language: pt_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"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Antever %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/sl.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
# Matjaž Mozetič <m.mozetic@matmoz.si>, 2015
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-12-08 08:32+0000\n"
"PO-Revision-Date: 2020-08-11 14:59+0000\n"
"Last-Translator: Matjaz Mozetic <matjaz@matmoz.si>\n"
"Language-Team: Slovenian (http://www.transifex.com/oca/OCA-knowledge-8-0/"
"language/sl/)\n"
"Language: sl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n"
"%100==4 ? 2 : 3;\n"
"X-Generator: Weblate 3.10\n"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Predogled %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""

#~ msgid "ir.attachment"
#~ msgstr "ir.attachment"


================================================
FILE: attachment_preview/i18n/tr.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-01-06 16:40+0000\n"
"Last-Translator: Yavuz Avci <yavuzavci@gmail.com>\n"
"Language-Team: none\n"
"Language: tr\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.3.2\n"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Ek"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "%s Önizle"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/vi_VN.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# 	* attachment_preview
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-08-23 14:29+0000\n"
"PO-Revision-Date: 2022-08-23 14:29+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: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr "Tập tin đính kèm"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr "Mở trong trang mới"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr "Xem trước"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "Xem trước %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/i18n/zh_CN.po
================================================
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * attachment_preview
#
# Translators:
# ITGeeker <alanljj@qq.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: knowledge (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-07-31 02:38+0000\n"
"PO-Revision-Date: 2017-04-19 01:16+0000\n"
"Last-Translator: ITGeeker <alanljj@qq.com>\n"
"Language-Team: Chinese (China) (http://www.transifex.com/oca/OCA-"
"knowledge-8-0/language/zh_CN/)\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"

#. module: attachment_preview
#: model:ir.model,name:attachment_preview.model_ir_attachment
msgid "Attachment"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open in new page"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Open preview {{attachmentCard.attachment.name}} in a new tab"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview"
msgstr ""

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/js/components/chatter/chatter.esm.js:0
#, python-format
msgid "Preview %s"
msgstr "预览 %s"

#. module: attachment_preview
#. openerp-web
#: code:addons/attachment_preview/static/src/xml/attachment_preview.xml:0
#, python-format
msgid "Preview {{attachmentCard.attachment.displayName}} in side panel"
msgstr ""


================================================
FILE: attachment_preview/models/__init__.py
================================================
# Copyright 2014 Therp BV (<http://therp.nl>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

from . import ir_attachment


================================================
FILE: attachment_preview/models/ir_attachment.py
================================================
# Copyright 2014 Therp BV (<http://therp.nl>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

import collections
import logging
import mimetypes
import os.path

from odoo import api, models

from odoo.addons.mail.tools.discuss import Store

_logger = logging.getLogger(__name__)


class IrAttachment(models.Model):
    _inherit = "ir.attachment"

    @api.model
    def get_binary_extension(self, model, ids, binary_field, filename_field=None):
        result = {}
        ids_to_browse = ids if isinstance(ids, collections.abc.Iterable) else [ids]

        # First pass: load fields in bin_size mode to avoid loading big files
        #  unnecessarily.
        if filename_field:
            for this in (
                self.env[model].with_context(bin_size=True).browse(ids_to_browse)
            ):
                extension = ""
                if hasattr(this, filename_field) and this[filename_field]:
                    filename, extension = os.path.splitext(this[filename_field])
                if this[binary_field] and extension:
                    result[this.id] = extension
                    _logger.debug(
                        "Got extension %s from filename %s",
                        extension,
                        this[filename_field],
                    )
        # Second pass for all attachments which have to be loaded fully
        #  to get the extension from the content
        ids_to_browse = [_id for _id in ids_to_browse if _id not in result]
        for this in self.env[model].with_context(bin_size=True).browse(ids_to_browse):
            result[this.id] = False
            mimetype = False
            try:
                import magic

                if (
                    model == self._name and binary_field == "datas" and this.store_fname
                ):  # pragma: no cover
                    mimetype = magic.from_file(
                        this._full_path(this.store_fname), mime=True
                    )
                else:  # pragma: no cover
                    mimetype = magic.from_buffer(this[binary_field], mime=True)
                    _logger.debug("Magic determined mimetype %s from buffer", mimetype)
            except (ImportError, Exception):
                try:
                    (mimetype, encoding) = mimetypes.guess_type(
                        "data:;base64," + this[binary_field].decode("utf-8"),
                        strict=False,
                    )
                except Exception as e:
                    _logger.debug("Error when guessing mimetype: %s", str(e))
            if mimetype:
                extension = mimetypes.guess_extension(
                    mimetype.split(";")[0], strict=False
                )
                result[this.id] = extension
        for _id in result:
            result[_id] = (result[_id] or "").lstrip(".").lower()
        return result if isinstance(ids, collections.abc.Iterable) else result[ids]

    @api.model
    def get_attachment_extension(self, ids):
        return self.get_binary_extension(self._name, ids, "datas", "name")

    def _to_store(self, store: Store, /, *, fields=None, extra_fields=None):
        """Adds extension in Store for attachments"""
        res = super()._to_store(store=store, fields=fields, extra_fields=extra_fields)
        attachment_extension = self.get_attachment_extension(self.ids)
        for attachment in store.data.get("ir.attachment"):
            store.data["ir.attachment"][attachment]["extension"] = (
                attachment_extension.get(attachment[0], "")
            )
        return res


================================================
FILE: attachment_preview/pyproject.toml
================================================
[build-system]
requires = ["whool"]
build-backend = "whool.buildapi"


================================================
FILE: attachment_preview/readme/CONTRIBUTORS.md
================================================
- Holger Brunn \<<mail@hunki-enterprises.com>\>
- Dennis Sluijk \<<d.sluijk@onestein.nl>\>


================================================
FILE: attachment_preview/readme/DESCRIPTION.md
================================================
This addon allows to preview attachments supported by
<http://viewerjs.org>.

Currently, that's most Libreoffice files and PDFs.

![Screenshot of split form view](/attachment_preview/static/description/screenshot-split.png)


================================================
FILE: attachment_preview/readme/INSTALL.md
================================================
For filetype recognition, you'll get the best results by installing
`python-magic`:

sudo apt-get install python-magic


================================================
FILE: attachment_preview/readme/USAGE.md
================================================
The module adds a little print preview icon right of download links for
attachments or binary fields. When a preview is opened from the
attachments menu it's shown next to the form view. From this screen you
can navigate through the attachments using the arrow buttons. Using the
pop-out button next to the navigational buttons you can open the preview
in a separate window.

![Screenshot navigator](/attachment_preview/static/description/screenshot-paginator.png)


================================================
FILE: attachment_preview/static/description/index.html
================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>README.rst</title>
<style type="text/css">

/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.

See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/

/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
  border: 0 }

table.borderless td, table.borderless th {
  /* Override padding for "table.docutils td" with "! important".
     The right padding separates the table cells. */
  padding: 0 0.5em 0 0 ! important }

.first {
  /* Override more specific margin styles with "! important". */
  margin-top: 0 ! important }

.last, .with-subtitle {
  margin-bottom: 0 ! important }

.hidden {
  display: none }

.subscript {
  vertical-align: sub;
  font-size: smaller }

.superscript {
  vertical-align: super;
  font-size: smaller }

a.toc-backref {
  text-decoration: none ;
  color: black }

blockquote.epigraph {
  margin: 2em 5em ; }

dl.docutils dd {
  margin-bottom: 0.5em }

object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
  overflow: hidden;
}

/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
  font-weight: bold }
*/

div.abstract {
  margin: 2em 5em }

div.abstract p.topic-title {
  font-weight: bold ;
  text-align: center }

div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
  margin: 2em ;
  border: medium outset ;
  padding: 1em }

div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
  font-weight: bold ;
  font-family: sans-serif }

div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
  color: red ;
  font-weight: bold ;
  font-family: sans-serif }

/* Uncomment (and remove this text!) to get reduced vertical space in
   compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
  margin-bottom: 0.5em }

div.compound .compound-last, div.compound .compound-middle {
  margin-top: 0.5em }
*/

div.dedication {
  margin: 2em 5em ;
  text-align: center ;
  font-style: italic }

div.dedication p.topic-title {
  font-weight: bold ;
  font-style: normal }

div.figure {
  margin-left: 2em ;
  margin-right: 2em }

div.footer, div.header {
  clear: both;
  font-size: smaller }

div.line-block {
  display: block ;
  margin-top: 1em ;
  margin-bottom: 1em }

div.line-block div.line-block {
  margin-top: 0 ;
  margin-bottom: 0 ;
  margin-left: 1.5em }

div.sidebar {
  margin: 0 0 0.5em 1em ;
  border: medium outset ;
  padding: 1em ;
  background-color: #ffffee ;
  width: 40% ;
  float: right ;
  clear: right }

div.sidebar p.rubric {
  font-family: sans-serif ;
  font-size: medium }

div.system-messages {
  margin: 5em }

div.system-messages h1 {
  color: red }

div.system-message {
  border: medium outset ;
  padding: 1em }

div.system-message p.system-message-title {
  color: red ;
  font-weight: bold }

div.topic {
  margin: 2em }

h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
  margin-top: 0.4em }

h1.title {
  text-align: center }

h2.subtitle {
  text-align: center }

hr.docutils {
  width: 75% }

img.align-left, .figure.align-left, object.align-left, table.align-left {
  clear: left ;
  float: left ;
  margin-right: 1em }

img.align-right, .figure.align-right, object.align-right, table.align-right {
  clear: right ;
  float: right ;
  margin-left: 1em }

img.align-center, .figure.align-center, object.align-center {
  display: block;
  margin-left: auto;
  margin-right: auto;
}

table.align-center {
  margin-left: auto;
  margin-right: auto;
}

.align-left {
  text-align: left }

.align-center {
  clear: both ;
  text-align: center }

.align-right {
  text-align: right }

/* reset inner alignment in figures */
div.align-right {
  text-align: inherit }

/* div.align-center * { */
/*   text-align: left } */

.align-top    {
  vertical-align: top }

.align-middle {
  vertical-align: middle }

.align-bottom {
  vertical-align: bottom }

ol.simple, ul.simple {
  margin-bottom: 1em }

ol.arabic {
  list-style: decimal }

ol.loweralpha {
  list-style: lower-alpha }

ol.upperalpha {
  list-style: upper-alpha }

ol.lowerroman {
  list-style: lower-roman }

ol.upperroman {
  list-style: upper-roman }

p.attribution {
  text-align: right ;
  margin-left: 50% }

p.caption {
  font-style: italic }

p.credits {
  font-style: italic ;
  font-size: smaller }

p.label {
  white-space: nowrap }

p.rubric {
  font-weight: bold ;
  font-size: larger ;
  color: maroon ;
  text-align: center }

p.sidebar-title {
  font-family: sans-serif ;
  font-weight: bold ;
  font-size: larger }

p.sidebar-subtitle {
  font-family: sans-serif ;
  font-weight: bold }

p.topic-title {
  font-weight: bold }

pre.address {
  margin-bottom: 0 ;
  margin-top: 0 ;
  font: inherit }

pre.literal-block, pre.doctest-block, pre.math, pre.code {
  margin-left: 2em ;
  margin-right: 2em }

pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}

span.classifier {
  font-family: sans-serif ;
  font-style: oblique }

span.classifier-delimiter {
  font-family: sans-serif ;
  font-weight: bold }

span.interpreted {
  font-family: sans-serif }

span.option {
  white-space: nowrap }

span.pre {
  white-space: pre }

span.problematic, pre.problematic {
  color: red }

span.section-subtitle {
  /* font-size relative to parent (h1..h6 element) */
  font-size: 80% }

table.citation {
  border-left: solid 1px gray;
  margin-left: 1px }

table.docinfo {
  margin: 2em 4em }

table.docutils {
  margin-top: 0.5em ;
  margin-bottom: 0.5em }

table.footnote {
  border-left: solid 1px black;
  margin-left: 1px }

table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
  padding-left: 0.5em ;
  padding-right: 0.5em ;
  vertical-align: top }

table.docutils th.field-name, table.docinfo th.docinfo-name {
  font-weight: bold ;
  text-align: left ;
  white-space: nowrap ;
  padding-left: 0 }

/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
  border: 0px;
  border-top: 2px solid;
  border-bottom: 2px solid;
  border-collapse: collapse;
}
table.docutils.booktabs * {
  border: 0px;
}
table.docutils.booktabs th {
  border-bottom: thin solid;
  text-align: left;
}

h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
  font-size: 100% }

ul.auto-toc {
  list-style-type: none }

</style>
</head>
<body>
<div class="document">


<a class="reference external image-reference" href="https://odoo-community.org/get-involved?utm_source=readme">
<img alt="Odoo Community Association" src="https://odoo-community.org/readme-banner-image" />
</a>
<div class="section" id="preview-attachments">
<h1>Preview attachments</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten.                   !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:e9abcd982f1b988dc4c79d2c451320fddb5fc1289f44e8b7c178c917b2bd4d1e
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/license-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/knowledge/tree/18.0/attachment_preview"><img alt="OCA/knowledge" src="https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/knowledge-18-0/knowledge-18-0-attachment_preview"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/knowledge&amp;target_branch=18.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This addon allows to preview attachments supported by
<a class="reference external" href="http://viewerjs.org">http://viewerjs.org</a>.</p>
<p>Currently, that’s most Libreoffice files and PDFs.</p>
<p><img alt="Screenshot of split form view" src="https://raw.githubusercontent.com/attachment_preview/static/description/screenshot-split.png" /></p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#installation" id="toc-entry-1">Installation</a></li>
<li><a class="reference internal" href="#usage" id="toc-entry-2">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="installation">
<h2><a class="toc-backref" href="#toc-entry-1">Installation</a></h2>
<p>For filetype recognition, you’ll get the best results by installing
<tt class="docutils literal"><span class="pre">python-magic</span></tt>:</p>
<p>sudo apt-get install python-magic</p>
</div>
<div class="section" id="usage">
<h2><a class="toc-backref" href="#toc-entry-2">Usage</a></h2>
<p>The module adds a little print preview icon right of download links for
attachments or binary fields. When a preview is opened from the
attachments menu it’s shown next to the form view. From this screen you
can navigate through the attachments using the arrow buttons. Using the
pop-out button next to the navigational buttons you can open the preview
in a separate window.</p>
<p><img alt="Screenshot navigator" src="https://raw.githubusercontent.com/attachment_preview/static/description/screenshot-paginator.png" /></p>
</div>
<div class="section" id="bug-tracker">
<h2><a class="toc-backref" href="#toc-entry-3">Bug Tracker</a></h2>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/knowledge/issues">GitHub Issues</a>.
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
<a class="reference external" href="https://github.com/OCA/knowledge/issues/new?body=module:%20attachment_preview%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h2><a class="toc-backref" href="#toc-entry-4">Credits</a></h2>
<div class="section" id="authors">
<h3><a class="toc-backref" href="#toc-entry-5">Authors</a></h3>
<ul class="simple">
<li>Therp BV</li>
<li>Onestein</li>
</ul>
</div>
<div class="section" id="contributors">
<h3><a class="toc-backref" href="#toc-entry-6">Contributors</a></h3>
<ul class="simple">
<li>Holger Brunn &lt;<a class="reference external" href="mailto:mail&#64;hunki-enterprises.com">mail&#64;hunki-enterprises.com</a>&gt;</li>
<li>Dennis Sluijk &lt;<a class="reference external" href="mailto:d.sluijk&#64;onestein.nl">d.sluijk&#64;onestein.nl</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h3><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h3>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>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.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/knowledge/tree/18.0/attachment_preview">OCA/knowledge</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</div>
</body>
</html>


================================================
FILE: attachment_preview/static/lib/ViewerJS/compatibility.js
================================================
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* Copyright 2012 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* globals VBArray, PDFJS */

'use strict';

// Initializing PDFJS global object here, it case if we need to change/disable
// some PDF.js features, e.g. range requests
if (typeof PDFJS === 'undefined') {
  (typeof window !== 'undefined' ? window : this).PDFJS = {};
}

// Checking if the typed arrays are supported
// Support: iOS<6.0 (subarray), IE<10, Android<4.0
(function checkTypedArrayCompatibility() {
  if (typeof Uint8Array !== 'undefined') {
    // Support: iOS<6.0
    if (typeof Uint8Array.prototype.subarray === 'undefined') {
        Uint8Array.prototype.subarray = function subarray(start, end) {
          return new Uint8Array(this.slice(start, end));
        };
        Float32Array.prototype.subarray = function subarray(start, end) {
          return new Float32Array(this.slice(start, end));
        };
    }

    // Support: Android<4.1
    if (typeof Float64Array === 'undefined') {
      window.Float64Array = Float32Array;
    }
    return;
  }

  function subarray(start, end) {
    return new TypedArray(this.slice(start, end));
  }

  function setArrayOffset(array, offset) {
    if (arguments.length < 2) {
      offset = 0;
    }
    for (var i = 0, n = array.length; i < n; ++i, ++offset) {
      this[offset] = array[i] & 0xFF;
    }
  }

  function TypedArray(arg1) {
    var result, i, n;
    if (typeof arg1 === 'number') {
      result = [];
      for (i = 0; i < arg1; ++i) {
        result[i] = 0;
      }
    } else if ('slice' in arg1) {
      result = arg1.slice(0);
    } else {
      result = [];
      for (i = 0, n = arg1.length; i < n; ++i) {
        result[i] = arg1[i];
      }
    }

    result.subarray = subarray;
    result.buffer = result;
    result.byteLength = result.length;
    result.set = setArrayOffset;

    if (typeof arg1 === 'object' && arg1.buffer) {
      result.buffer = arg1.buffer;
    }
    return result;
  }

  window.Uint8Array = TypedArray;
  window.Int8Array = TypedArray;

  // we don't need support for set, byteLength for 32-bit array
  // so we can use the TypedArray as well
  window.Uint32Array = TypedArray;
  window.Int32Array = TypedArray;
  window.Uint16Array = TypedArray;
  window.Float32Array = TypedArray;
  window.Float64Array = TypedArray;
})();

// URL = URL || webkitURL
// Support: Safari<7, Android 4.2+
(function normalizeURLObject() {
  if (!window.URL) {
    window.URL = window.webkitURL;
  }
})();

// Object.defineProperty()?
// Support: Android<4.0, Safari<5.1
(function checkObjectDefinePropertyCompatibility() {
  if (typeof Object.defineProperty !== 'undefined') {
    var definePropertyPossible = true;
    try {
      // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
      // and thus the native version is not sufficient
      Object.defineProperty(new Image(), 'id', { value: 'test' });
      // ... another test for android gb browser for non-DOM objects
      var Test = function Test() {};
      Test.prototype = { get id() { } };
      Object.defineProperty(new Test(), 'id',
        { value: '', configurable: true, enumerable: true, writable: false });
    } catch (e) {
      definePropertyPossible = false;
    }
    if (definePropertyPossible) {
      return;
    }
  }

  Object.defineProperty = function objectDefineProperty(obj, name, def) {
    delete obj[name];
    if ('get' in def) {
      obj.__defineGetter__(name, def['get']);
    }
    if ('set' in def) {
      obj.__defineSetter__(name, def['set']);
    }
    if ('value' in def) {
      obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
        this.__defineGetter__(name, function objectDefinePropertyGetter() {
          return value;
        });
        return value;
      });
      obj[name] = def.value;
    }
  };
})();


// No XMLHttpRequest#response?
// Support: IE<11, Android <4.0
(function checkXMLHttpRequestResponseCompatibility() {
  var xhrPrototype = XMLHttpRequest.prototype;
  var xhr = new XMLHttpRequest();
  if (!('overrideMimeType' in xhr)) {
    // IE10 might have response, but not overrideMimeType
    // Support: IE10
    Object.defineProperty(xhrPrototype, 'overrideMimeType', {
      value: function xmlHttpRequestOverrideMimeType(mimeType) {}
    });
  }
  if ('responseType' in xhr) {
    return;
  }

  // The worker will be using XHR, so we can save time and disable worker.
  PDFJS.disableWorker = true;

  Object.defineProperty(xhrPrototype, 'responseType', {
    get: function xmlHttpRequestGetResponseType() {
      return this._responseType || 'text';
    },
    set: function xmlHttpRequestSetResponseType(value) {
      if (value === 'text' || value === 'arraybuffer') {
        this._responseType = value;
        if (value === 'arraybuffer' &&
            typeof this.overrideMimeType === 'function') {
          this.overrideMimeType('text/plain; charset=x-user-defined');
        }
      }
    }
  });

  // Support: IE9
  if (typeof VBArray !== 'undefined') {
    Object.defineProperty(xhrPrototype, 'response', {
      get: function xmlHttpRequestResponseGet() {
        if (this.responseType === 'arraybuffer') {
          return new Uint8Array(new VBArray(this.responseBody).toArray());
        } else {
          return this.responseText;
        }
      }
    });
    return;
  }

  Object.defineProperty(xhrPrototype, 'response', {
    get: function xmlHttpRequestResponseGet() {
      if (this.responseType !== 'arraybuffer') {
        return this.responseText;
      }
      var text = this.responseText;
      var i, n = text.length;
      var result = new Uint8Array(n);
      for (i = 0; i < n; ++i) {
        result[i] = text.charCodeAt(i) & 0xFF;
      }
      return result.buffer;
    }
  });
})();

// window.btoa (base64 encode function) ?
// Support: IE<10
(function checkWindowBtoaCompatibility() {
  if ('btoa' in window) {
    return;
  }

  var digits =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

  window.btoa = function windowBtoa(chars) {
    var buffer = '';
    var i, n;
    for (i = 0, n = chars.length; i < n; i += 3) {
      var b1 = chars.charCodeAt(i) & 0xFF;
      var b2 = chars.charCodeAt(i + 1) & 0xFF;
      var b3 = chars.charCodeAt(i + 2) & 0xFF;
      var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
      var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
      var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
      buffer += (digits.charAt(d1) + digits.charAt(d2) +
                 digits.charAt(d3) + digits.charAt(d4));
    }
    return buffer;
  };
})();

// window.atob (base64 encode function)?
// Support: IE<10
(function checkWindowAtobCompatibility() {
  if ('atob' in window) {
    return;
  }

  // https://github.com/davidchambers/Base64.js
  var digits =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  window.atob = function (input) {
    input = input.replace(/=+$/, '');
    if (input.length % 4 === 1) {
      throw new Error('bad atob input');
    }
    for (
      // initialize result and counters
      var bc = 0, bs, buffer, idx = 0, output = '';
      // get next character
      buffer = input.charAt(idx++);
      // character found in table?
      // initialize bit storage and add its ascii value
      ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
        // and if not first of each 4 characters,
        // convert the first 8 bits to one ascii character
        bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
    ) {
      // try to find character in table (0-63, not found => -1)
      buffer = digits.indexOf(buffer);
    }
    return output;
  };
})();

// Function.prototype.bind?
// Support: Android<4.0, iOS<6.0
(function checkFunctionPrototypeBindCompatibility() {
  if (typeof Function.prototype.bind !== 'undefined') {
    return;
  }

  Function.prototype.bind = function functionPrototypeBind(obj) {
    var fn = this, headArgs = Array.prototype.slice.call(arguments, 1);
    var bound = function functionPrototypeBindBound() {
      var args = headArgs.concat(Array.prototype.slice.call(arguments));
      return fn.apply(obj, args);
    };
    return bound;
  };
})();

// HTMLElement dataset property
// Support: IE<11, Safari<5.1, Android<4.0
(function checkDatasetProperty() {
  var div = document.createElement('div');
  if ('dataset' in div) {
    return; // dataset property exists
  }

  Object.defineProperty(HTMLElement.prototype, 'dataset', {
    get: function() {
      if (this._dataset) {
        return this._dataset;
      }

      var dataset = {};
      for (var j = 0, jj = this.attributes.length; j < jj; j++) {
        var attribute = this.attributes[j];
        if (attribute.name.substring(0, 5) !== 'data-') {
          continue;
        }
        var key = attribute.name.substring(5).replace(/\-([a-z])/g,
          function(all, ch) {
            return ch.toUpperCase();
          });
        dataset[key] = attribute.value;
      }

      Object.defineProperty(this, '_dataset', {
        value: dataset,
        writable: false,
        enumerable: false
      });
      return dataset;
    },
    enumerable: true
  });
})();

// HTMLElement classList property
// Support: IE<10, Android<4.0, iOS<5.0
(function checkClassListProperty() {
  var div = document.createElement('div');
  if ('classList' in div) {
    return; // classList property exists
  }

  function changeList(element, itemName, add, remove) {
    var s = element.className || '';
    var list = s.split(/\s+/g);
    if (list[0] === '') {
      list.shift();
    }
    var index = list.indexOf(itemName);
    if (index < 0 && add) {
      list.push(itemName);
    }
    if (index >= 0 && remove) {
      list.splice(index, 1);
    }
    element.className = list.join(' ');
    return (index >= 0);
  }

  var classListPrototype = {
    add: function(name) {
      changeList(this.element, name, true, false);
    },
    contains: function(name) {
      return changeList(this.element, name, false, false);
    },
    remove: function(name) {
      changeList(this.element, name, false, true);
    },
    toggle: function(name) {
      changeList(this.element, name, true, true);
    }
  };

  Object.defineProperty(HTMLElement.prototype, 'classList', {
    get: function() {
      if (this._classList) {
        return this._classList;
      }

      var classList = Object.create(classListPrototype, {
        element: {
          value: this,
          writable: false,
          enumerable: true
        }
      });
      Object.defineProperty(this, '_classList', {
        value: classList,
        writable: false,
        enumerable: false
      });
      return classList;
    },
    enumerable: true
  });
})();

// Check console compatibility
// In older IE versions the console object is not available
// unless console is open.
// Support: IE<10
(function checkConsoleCompatibility() {
  if (!('console' in window)) {
    window.console = {
      log: function() {},
      error: function() {},
      warn: function() {}
    };
  } else if (!('bind' in console.log)) {
    // native functions in IE9 might not have bind
    console.log = (function(fn) {
      return function(msg) { return fn(msg); };
    })(console.log);
    console.error = (function(fn) {
      return function(msg) { return fn(msg); };
    })(console.error);
    console.warn = (function(fn) {
      return function(msg) { return fn(msg); };
    })(console.warn);
  }
})();

// Check onclick compatibility in Opera
// Support: Opera<15
(function checkOnClickCompatibility() {
  // workaround for reported Opera bug DSK-354448:
  // onclick fires on disabled buttons with opaque content
  function ignoreIfTargetDisabled(event) {
    if (isDisabled(event.target)) {
      event.stopPropagation();
    }
  }
  function isDisabled(node) {
    return node.disabled || (node.parentNode && isDisabled(node.parentNode));
  }
  if (navigator.userAgent.indexOf('Opera') !== -1) {
    // use browser detection since we cannot feature-check this bug
    document.addEventListener('click', ignoreIfTargetDisabled, true);
  }
})();

// Checks if possible to use URL.createObjectURL()
// Support: IE
(function checkOnBlobSupport() {
  // sometimes IE loosing the data created with createObjectURL(), see #3977
  if (navigator.userAgent.indexOf('Trident') >= 0) {
    PDFJS.disableCreateObjectURL = true;
  }
})();

// Checks if navigator.language is supported
(function checkNavigatorLanguage() {
  if ('language' in navigator) {
    return;
  }
  PDFJS.locale = navigator.userLanguage || 'en-US';
})();

(function checkRangeRequests() {
  // Safari has issues with cached range requests see:
  // https://github.com/mozilla/pdf.js/issues/3260
  // Last tested with version 6.0.4.
  // Support: Safari 6.0+
  var isSafari = Object.prototype.toString.call(
                  window.HTMLElement).indexOf('Constructor') > 0;

  // Older versions of Android (pre 3.0) has issues with range requests, see:
  // https://github.com/mozilla/pdf.js/issues/3381.
  // Make sure that we only match webkit-based Android browsers,
  // since Firefox/Fennec works as expected.
  // Support: Android<3.0
  var regex = /Android\s[0-2][^\d]/;
  var isOldAndroid = regex.test(navigator.userAgent);

  // Range requests are broken in Chrome 39 and 40, https://crbug.com/442318
  var isChromeWithRangeBug = /Chrome\/(39|40)\./.test(navigator.userAgent);

  if (isSafari || isOldAndroid || isChromeWithRangeBug) {
    PDFJS.disableRange = true;
    PDFJS.disableStream = true;
  }
})();

// Check if the browser supports manipulation of the history.
// Support: IE<10, Android<4.2
(function checkHistoryManipulation() {
  // Android 2.x has so buggy pushState support that it was removed in
  // Android 3.0 and restored as late as in Android 4.2.
  // Support: Android 2.x
  if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {
    PDFJS.disableHistory = true;
  }
})();

// Support: IE<11, Chrome<21, Android<4.4, Safari<6
(function checkSetPresenceInImageData() {
  // IE < 11 will use window.CanvasPixelArray which lacks set function.
  if (window.CanvasPixelArray) {
    if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
      window.CanvasPixelArray.prototype.set = function(arr) {
        for (var i = 0, ii = this.length; i < ii; i++) {
          this[i] = arr[i];
        }
      };
    }
  } else {
    // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
    // Because we cannot feature detect it, we rely on user agent parsing.
    var polyfill = false, versionMatch;
    if (navigator.userAgent.indexOf('Chrom') >= 0) {
      versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
      // Chrome < 21 lacks the set function.
      polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
    } else if (navigator.userAgent.indexOf('Android') >= 0) {
      // Android < 4.4 lacks the set function.
      // Android >= 4.4 will contain Chrome in the user agent,
      // thus pass the Chrome check above and not reach this block.
      polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent);
    } else if (navigator.userAgent.indexOf('Safari') >= 0) {
      versionMatch = navigator.userAgent.
        match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
      // Safari < 6 lacks the set function.
      polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
    }

    if (polyfill) {
      var contextPrototype = window.CanvasRenderingContext2D.prototype;
      contextPrototype._createImageData = contextPrototype.createImageData;
      contextPrototype.createImageData = function(w, h) {
        var imageData = this._createImageData(w, h);
        imageData.data.set = function(arr) {
          for (var i = 0, ii = this.length; i < ii; i++) {
            this[i] = arr[i];
          }
        };
        return imageData;
      };
    }
  }
})();

// Support: IE<10, Android<4.0, iOS
(function checkRequestAnimationFrame() {
  function fakeRequestAnimationFrame(callback) {
    window.setTimeout(callback, 20);
  }

  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
  if (isIOS) {
    // requestAnimationFrame on iOS is broken, replacing with fake one.
    window.requestAnimationFrame = fakeRequestAnimationFrame;
    return;
  }
  if ('requestAnimationFrame' in window) {
    return;
  }
  window.requestAnimationFrame =
    window.mozRequestAnimationFrame ||
    window.webkitRequestAnimationFrame ||
    fakeRequestAnimationFrame;
})();

(function checkCanvasSizeLimitation() {
  var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
  var isAndroid = /Android/g.test(navigator.userAgent);
  if (isIOS || isAndroid) {
    // 5MP
    PDFJS.maxCanvasPixels = 5242880;
  }
})();

// Disable fullscreen support for certain problematic configurations.
// Support: IE11+ (when embedded).
(function checkFullscreenSupport() {
  var isEmbeddedIE = (navigator.userAgent.indexOf('Trident') >= 0 &&
                      window.parent !== window);
  if (isEmbeddedIE) {
    PDFJS.disableFullscreen = true;
  }
})();


================================================
FILE: attachment_preview/static/lib/ViewerJS/example.local.css
================================================
/* This is just a sample file with CSS rules. You should write your own @font-face declarations
 * to add support for your desired fonts.
 */

@font-face {
  font-family: 'Novecentowide Book';
  src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot");
  src: url("/ViewerJS/fonts/Novecentowide-Bold-webfont.eot?#iefix") format("embedded-opentype"),
  url("/ViewerJS/fonts/Novecentowide-Bold-webfont.woff") format("woff"),
  url("/fonts/Novecentowide-Bold-webfont.ttf") format("truetype"),
  url("/fonts/Novecentowide-Bold-webfont.svg#NovecentowideBookBold") format("svg");
  font-weight: normal;
  font-style: normal;
}

@font-face {
    font-family: 'exotica';
    src: url('/ViewerJS/fonts/Exotica-webfont.eot');
    src: url('/ViewerJS/fonts/Exotica-webfont.eot?#iefix') format('embedded-opentype'),
         url('/ViewerJS/fonts/Exotica-webfont.woff') format('woff'),
         url('/ViewerJS/fonts/Exotica-webfont.ttf') format('truetype'),
         url('/ViewerJS/fonts/Exotica-webfont.svg#exoticamedium') format('svg');
    font-weight: normal;
    font-style: normal;

}



================================================
FILE: attachment_preview/static/lib/ViewerJS/index.html
================================================
<!DOCTYPE html>
<html dir="ltr" lang="en-US">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

<!--
This is a generated file. DO NOT EDIT.

Copyright (C) 2012-2015 KO GmbH <copyright@kogmbh.com>

@licstart
This file is the compiled version of the ViewerJS module.

ViewerJS is free software: you can redistribute it and/or modify it
under the terms of the GNU Affero General Public License (GNU AGPL)
as published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.

ViewerJS is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with ViewerJS.  If not, see <http://www.gnu.org/licenses/>.
@licend

@source: http://viewerjs.org/
@source: http://github.com/kogmbh/ViewerJS
-->

        <title>ViewerJS</title>
        <!-- If you want to use custom CSS (@font-face rules, for example) you should uncomment
             the following reference and use a local.css file for that. See the example.local.css
             file for a sample.
        <link rel="stylesheet" type="text/css" href="local.css" media="screen"/>
        -->
        <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/>
                <script type="text/javascript">
            ////<![CDATA[
var ODFViewerPlugin_css="@namespace cursor url(urn:webodf:names:cursor);.caret {opacity: 0 !important;}";function ODFViewerPlugin(){function b(b){var a=document.createElement("script");a.async=!1;a.src="./webodf.js";a.type="text/javascript";a.onload=function(){runtime.loadClass("gui.HyperlinkClickHandler");runtime.loadClass("odf.OdfCanvas");runtime.loadClass("ops.Session");runtime.loadClass("gui.CaretManager");runtime.loadClass("gui.HyperlinkTooltipView");runtime.loadClass("gui.SessionController");runtime.loadClass("gui.SvgSelectionView");runtime.loadClass("gui.SelectionViewManager");runtime.loadClass("gui.ShadowCursor");
runtime.loadClass("gui.SessionView");b()};document.head.appendChild(a);a=document.createElementNS(document.head.namespaceURI,"style");a.setAttribute("media","screen, print, handheld, projection");a.setAttribute("type","text/css");a.appendChild(document.createTextNode(ODFViewerPlugin_css));document.head.appendChild(a)}var r=this,f=null,x=null,s=null,k=null;this.initialize=function(q,a){b(function(){var e,c,b,q,l,z,u,v;x=document.getElementById("canvas");f=new odf.OdfCanvas(x);f.load(a);f.addListener("statereadychange",
function(){s=f.odfContainer().rootElement;k=f.odfContainer().getDocumentType(s);if("text"===k){f.enableAnnotations(!0,!1);e=new ops.Session(f);b=e.getOdtDocument();q=new gui.ShadowCursor(b);c=new gui.SessionController(e,"localuser",q,{});v=c.getEventManager();z=new gui.CaretManager(c,f.getViewport());l=new gui.SelectionViewManager(gui.SvgSelectionView);new gui.SessionView({caretAvatarsInitiallyVisible:!1},"localuser",e,c.getSessionConstraints(),z,l);l.registerCursor(q);u=new gui.HyperlinkTooltipView(f,
c.getHyperlinkClickHandler().getModifier);v.subscribe("mousemove",u.showTooltip);v.subscribe("mouseout",u.hideTooltip);var a=new ops.OpAddMember;a.init({memberid:"localuser",setProperties:{fillName:runtime.tr("Unknown Author"),color:"blue"}});e.enqueue([a]);c.insertLocalCursor()}r.onLoad()})})};this.isSlideshow=function(){return"presentation"===k};this.onLoad=function(){};this.fitToWidth=function(b){f.fitToWidth(b)};this.fitToHeight=function(b){f.fitToHeight(b)};this.fitToPage=function(b,a){f.fitToContainingElement(b,
a)};this.fitSmart=function(b){f.fitSmart(b)};this.getZoomLevel=function(){return f.getZoomLevel()};this.setZoomLevel=function(b){f.setZoomLevel(b)};this.getPages=function(){var b=Array.prototype.slice.call(s.getElementsByTagNameNS("urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","page")),a=[],e,c;for(e=0;e<b.length;e+=1)c=[b[e].getAttribute("draw:name"),b[e]],a.push(c);return a};this.showPage=function(b){f.showPage(b)};this.getPluginName=function(){return"WebODF"};this.getPluginVersion=function(){return"undefined"!==
String(typeof webodf)?webodf.Version:"Unknown"};this.getPluginURL=function(){return"http://webodf.org"}};var PDFViewerPlugin_css=".page {margin: 7px auto 7px auto;position: relative;overflow: hidden;background-clip: content-box;background-color: white;box-shadow:         0px 0px 7px rgba(0, 0, 0, 0.75);-webkit-box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.75);-moz-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);-ms-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);-o-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);}.textLayer {position: absolute;left: 0;top: 0;right: 0;bottom: 0;color: #000;font-family: sans-serif;overflow: hidden;}.textLayer > div {color: transparent;position: absolute;line-height: 1;white-space: pre;cursor: text;}::selection { background:rgba(0,0,255,0.3); }::-moz-selection { background:rgba(0,0,255,0.3); }";function PDFViewerPlugin(){function b(d,a){var b=document.createElement("script");b.async=!1;b.src=d;b.type="text/javascript";b.onload=a||b.onload;document.getElementsByTagName("head")[0].appendChild(b)}function r(d){var a;b("./compatibility.js",function(){b("./pdf.js");b("./ui_utils.js");b("./text_layer_builder.js");b("./pdfjsversion.js",d)});a=document.createElementNS(document.head.namespaceURI,"style");a.setAttribute("media","screen, print, handheld, projection");a.setAttribute("type","text/css");
a.appendChild(document.createTextNode(PDFViewerPlugin_css));document.head.appendChild(a)}function f(d){if("none"===d.style.display)return!1;var a=u.scrollTop,b=a+u.clientHeight,c=d.offsetTop;d=c+d.clientHeight;return c>=a&&c<b||d>=a&&d<b||c<a&&d>=b}function x(d,a,b){var e=c[d.pageIndex],f=e.getElementsByTagName("canvas")[0],h=e.getElementsByTagName("div")[0],k="scale("+g+", "+g+")";e.style.width=a+"px";e.style.height=b+"px";f.width=a;f.height=b;h.style.width=a+"px";h.style.height=b+"px";CustomStyle.setProp("transform",
h,k);CustomStyle.setProp("transformOrigin",h,"0% 0%");t[d.pageIndex]=t[d.pageIndex]===l.RUNNING?l.RUNNINGOUTDATED:l.BLANK}function s(d){var a,b;t[d.pageIndex]===l.BLANK&&(t[d.pageIndex]=l.RUNNING,a=c[d.pageIndex],b=B[d.pageIndex],a=a.getElementsByTagName("canvas")[0],d.render({canvasContext:a.getContext("2d"),textLayer:b,viewport:d.getViewport(g)}).promise.then(function(){t[d.pageIndex]===l.RUNNINGOUTDATED?(t[d.pageIndex]=l.BLANK,s(d)):t[d.pageIndex]=l.FINISHED}))}function k(){var d=!a.isSlideshow();
c.forEach(function(a){d&&(a.style.display="block");u.appendChild(a)});a.showPage(1);a.onLoad()}function q(d){var a,b,f,m,h,n;a=d.pageIndex+1;n=d.getViewport(g);h=document.createElement("div");h.id="pageContainer"+a;h.className="page";h.style.display="none";m=document.createElement("canvas");m.id="canvas"+a;b=document.createElement("div");b.className="textLayer";b.id="textLayer"+a;h.appendChild(m);h.appendChild(b);e[d.pageIndex]=d;c[d.pageIndex]=h;t[d.pageIndex]=l.BLANK;x(d,n.width,n.height);y<n.width&&
(y=n.width);w<n.height&&(w=n.height);n.width<n.height&&(p=!1);f=new TextLayerBuilder({textLayerDiv:b,viewport:n,pageIndex:a-1});d.getTextContent().then(function(a){f.setTextContent(a);f.render(z)});B[d.pageIndex]=f;E+=1;E===v.numPages&&k()}var a=this,e=[],c=[],B=[],t=[],l={BLANK:0,RUNNING:1,FINISHED:2,RUNNINGOUTDATED:3},z=200,u=null,v=null,p=!0,g=1,A=1,y=0,w=0,E=0;this.initialize=function(a,b){var c;r(function(){PDFJS.workerSrc="./pdf.worker.js";PDFJS.getDocument(b).then(function(b){v=b;u=a;for(c=
0;c<v.numPages;c+=1)v.getPage(c+1).then(q)})})};this.isSlideshow=function(){return p};this.onLoad=function(){};this.getPages=function(){return c};this.fitToWidth=function(d){y!==d&&(d/=y,a.setZoomLevel(d))};this.fitToHeight=function(d){w!==d&&(d/=w,a.setZoomLevel(d))};this.fitToPage=function(d,b){var c=d/y;b/w<c&&(c=b/w);a.setZoomLevel(c)};this.fitSmart=function(d,b){var c=d/y;b&&b/w<c&&(c=b/w);c=Math.min(1,c);a.setZoomLevel(c)};this.setZoomLevel=function(a){var b;if(g!==a)for(g=a,a=0;a<e.length;a+=
1)b=e[a].getViewport(g),x(e[a],b.width,b.height)};this.getZoomLevel=function(){return g};this.onScroll=function(){var a;for(a=0;a<c.length;a+=1)f(c[a])&&s(e[a])};this.getPageInView=function(){var b;if(a.isSlideshow())return A;for(b=0;b<c.length;b+=1)if(f(c[b]))return b+1};this.showPage=function(b){a.isSlideshow()?(c[A-1].style.display="none",A=b,s(e[b-1]),c[b-1].style.display="block"):(b=c[b-1],b.parentNode.scrollTop=b.offsetTop)};this.getPluginName=function(){return"PDF.js"};this.getPluginVersion=
function(){return"undefined"!==String(typeof pdfjs_version)?pdfjs_version:"From Source"};this.getPluginURL=function(){return"https://github.com/mozilla/pdf.js/"}};var ViewerJS_version="0.5.8";var viewer_css="* {padding: 0;margin: 0;}html > body {font-family: sans-serif;overflow: hidden;}.titlebar > span,.toolbarLabel,input,button,select {font: message-box;}#titlebar {position: absolute;z-index: 2;top: 0px;left: 0px;height: 32px;width: 100%;overflow: hidden;-webkit-box-shadow: 0px 1px 3px rgba(50, 50, 50, 0.75);-moz-box-shadow:    0px 1px 3px rgba(50, 50, 50, 0.75);box-shadow:         0px 1px 3px rgba(50, 50, 50, 0.75);background-image: url(images/texture.png), linear-gradient(rgba(69, 69, 69, .95), rgba(82, 82, 82, .99));background-image: url(images/texture.png), -webkit-linear-gradient(rgba(69, 69, 69, .95), rgba(82, 82, 82, .99));background-image: url(images/texture.png), -moz-linear-gradient(rgba(69, 69, 69, .95), rgba(82, 82, 82, .99));background-image: url(images/texture.png), -ms-linear-gradient(rgba(69, 69, 69, .95), rgba(82, 82, 82, .99));background-image: url(images/texture.png), -o-linear-gradient(rgba(69, 69, 69, .95), rgba(82, 82, 82, .99));}#titlebar a, #aboutDialog a, #titlebar a:visited, #aboutDialog a:visited {color: #ccc;}#documentName {margin-right: 10px;margin-left: 10px;margin-top: 8px;color: #F2F2F2;line-height: 14px;font-family: sans-serif;}#documentName {font-size: 14px;}#toolbarContainer {position: absolute;z-index: 2;bottom: 0px;left: 0px;height: 32px;width: 100%;overflow: hidden;-webkit-box-shadow: 0px -1px 3px rgba(50, 50, 50, 0.75);-moz-box-shadow:    0px -1px 3px rgba(50, 50, 50, 0.75);box-shadow:         0px -1px 3px rgba(50, 50, 50, 0.75);background-image: url(images/texture.png), linear-gradient(rgba(82, 82, 82, .99), rgba(69, 69, 69, .95));background-image: url(images/texture.png), -webkit-linear-gradient(rgba(82, 82, 82, .99), rgba(69, 69, 69, .95));background-image: url(images/texture.png), -moz-linear-gradient(rgba(82, 82, 82, .99), rgba(69, 69, 69, .95));background-image: url(images/texture.png), -ms-linear-gradient(rgba(82, 82, 82, .99), rgba(69, 69, 69, .95));background-image: url(images/texture.png), -o-linear-gradient(rgba(82, 82, 82, .99), rgba(69, 69, 69, .95));}#toolbar {position: relative;}#toolbarMiddleContainer, #toolbarLeft {visibility: hidden;}html[dir='ltr'] #toolbarLeft {margin-left: -1px;}html[dir='rtl'] #toolbarRight,html[dir='rtl'] #titlebarRight {margin-left: -1px;}html[dir='ltr'] #toolbarLeft,html[dir='rtl'] #toolbarRight,html[dir='rtl'] #titlebarRight {position: absolute;top: 0;left: 0;}html[dir='rtl'] #toolbarLeft,html[dir='ltr'] #toolbarRight,html[dir='ltr'] #titlebarRight {position: absolute;top: 0;right: 0;}html[dir='ltr'] #toolbarLeft > *,html[dir='ltr'] #toolbarMiddle > *,html[dir='ltr'] #toolbarRight > *,html[dir='ltr'] #titlebarRight > * {float: left;}html[dir='rtl'] #toolbarLeft > *,html[dir='rtl'] #toolbarMiddle > *,html[dir='rtl'] #toolbarRight > *,html[dir='rtl'] #titlebarRight > * {float: right;}html[dir='ltr'] .outerCenter {float: right;position: relative;right: 50%;}html[dir='rtl'] .outerCenter {float: left;position: relative;left: 50%;}html[dir='ltr'] .innerCenter {float: right;position: relative;right: -50%;}html[dir='rtl'] .innerCenter {float: left;position: relative;left: -50%;}html[dir='ltr'] .splitToolbarButton {margin: 3px 2px 4px 0;display: inline-block;}html[dir='rtl'] .splitToolbarButton {margin: 3px 0 4px 2px;display: inline-block;}html[dir='ltr'] .splitToolbarButton > .toolbarButton {border-radius: 0;float: left;}html[dir='rtl'] .splitToolbarButton > .toolbarButton {border-radius: 0;float: right;}.splitToolbarButton.toggled .toolbarButton {margin: 0;}.toolbarButton {border: 0 none;background-color: rgba(0, 0, 0, 0);min-width: 32px;height: 25px;border-radius: 2px;background-image: none;}html[dir='ltr'] .toolbarButton,html[dir='ltr'] .dropdownToolbarButton {margin: 3px 2px 4px 0;}html[dir='rtl'] .toolbarButton,html[dir='rtl'] .dropdownToolbarButton {margin: 3px 0 4px 2px;}.toolbarButton:hover,.toolbarButton:focus,.dropdownToolbarButton {background-color: hsla(0,0%,0%,.12);background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid hsla(0,0%,0%,.35);border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 1px 0 hsla(0,0%,100%,.05);}.toolbarButton:hover:active,.dropdownToolbarButton:hover:active {background-color: hsla(0,0%,0%,.2);background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,0 0 1px hsla(0,0%,0%,.2) inset,0 1px 0 hsla(0,0%,100%,.05);}.splitToolbarButton:hover > .toolbarButton,.splitToolbarButton:focus > .toolbarButton,.splitToolbarButton.toggled > .toolbarButton,.toolbarButton.textButton {background-color: hsla(0,0%,0%,.12);background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid hsla(0,0%,0%,.35);border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 1px 0 hsla(0,0%,100%,.05);-webkit-transition-property: background-color, border-color, box-shadow;-webkit-transition-duration: 150ms;-webkit-transition-timing-function: ease;-moz-transition-property: background-color, border-color, box-shadow;-moz-transition-duration: 150ms;-moz-transition-timing-function: ease;-ms-transition-property: background-color, border-color, box-shadow;-ms-transition-duration: 150ms;-ms-transition-timing-function: ease;-o-transition-property: background-color, border-color, box-shadow;-o-transition-duration: 150ms;-o-transition-timing-function: ease;transition-property: background-color, border-color, box-shadow;transition-duration: 150ms;transition-timing-function: ease;}.splitToolbarButton > .toolbarButton:hover,.splitToolbarButton > .toolbarButton:focus,.dropdownToolbarButton:hover,.toolbarButton.textButton:hover,.toolbarButton.textButton:focus {background-color: hsla(0,0%,0%,.2);box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 0 1px hsla(0,0%,0%,.05);z-index: 199;}.splitToolbarButton:hover > .toolbarButton,.splitToolbarButton:focus > .toolbarButton,.splitToolbarButton.toggled > .toolbarButton,.toolbarButton.textButton {background-color: hsla(0,0%,0%,.12);background-image: -webkit-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -ms-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: -o-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid hsla(0,0%,0%,.35);border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 1px 0 hsla(0,0%,100%,.05);-webkit-transition-property: background-color, border-color, box-shadow;-webkit-transition-duration: 150ms;-webkit-transition-timing-function: ease;-moz-transition-property: background-color, border-color, box-shadow;-moz-transition-duration: 150ms;-moz-transition-timing-function: ease;-ms-transition-property: background-color, border-color, box-shadow;-ms-transition-duration: 150ms;-ms-transition-timing-function: ease;-o-transition-property: background-color, border-color, box-shadow;-o-transition-duration: 150ms;-o-transition-timing-function: ease;transition-property: background-color, border-color, box-shadow;transition-duration: 150ms;transition-timing-function: ease;}.splitToolbarButton > .toolbarButton:hover,.splitToolbarButton > .toolbarButton:focus,.dropdownToolbarButton:hover,.toolbarButton.textButton:hover,.toolbarButton.textButton:focus {background-color: hsla(0,0%,0%,.2);box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 0 1px hsla(0,0%,0%,.05);z-index: 199;}.dropdownToolbarButton {border: 1px solid #333 !important;}.toolbarButton,.dropdownToolbarButton {min-width: 16px;padding: 2px 6px 2px;border: 1px solid transparent;border-radius: 2px;color: hsl(0,0%,95%);font-size: 12px;line-height: 14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor: default;-webkit-transition-property: background-color, border-color, box-shadow;-webkit-transition-duration: 150ms;-webkit-transition-timing-function: ease;-moz-transition-property: background-color, border-color, box-shadow;-moz-transition-duration: 150ms;-moz-transition-timing-function: ease;-ms-transition-property: background-color, border-color, box-shadow;-ms-transition-duration: 150ms;-ms-transition-timing-function: ease;-o-transition-property: background-color, border-color, box-shadow;-o-transition-duration: 150ms;-o-transition-timing-function: ease;transition-property: background-color, border-color, box-shadow;transition-duration: 150ms;transition-timing-function: ease;}html[dir='ltr'] .toolbarButton,html[dir='ltr'] .dropdownToolbarButton {margin: 3px 2px 4px 0;}html[dir='rtl'] .toolbarButton,html[dir='rtl'] .dropdownToolbarButton {margin: 3px 0 4px 2px;}.splitToolbarButton:hover > .splitToolbarButtonSeparator,.splitToolbarButton.toggled > .splitToolbarButtonSeparator {padding: 12px 0;margin: 0;box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);-webkit-transition-property: padding;-webkit-transition-duration: 10ms;-webkit-transition-timing-function: ease;-moz-transition-property: padding;-moz-transition-duration: 10ms;-moz-transition-timing-function: ease;-ms-transition-property: padding;-ms-transition-duration: 10ms;-ms-transition-timing-function: ease;-o-transition-property: padding;-o-transition-duration: 10ms;-o-transition-timing-function: ease;transition-property: padding;transition-duration: 10ms;transition-timing-function: ease;}.toolbarButton.toggled:hover:active,.splitToolbarButton > .toolbarButton:hover:active {background-color: hsla(0,0%,0%,.4);border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,0 0 1px hsla(0,0%,0%,.3) inset,0 1px 0 hsla(0,0%,100%,.05);}html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {position: relative;margin: 0;margin-left: 4px;margin-right: -1px;border-top-left-radius: 2px;border-bottom-left-radius: 2px;border-right-color: transparent;}html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {position: relative;margin: 0;margin-left: -1px;border-top-right-radius: 2px;border-bottom-right-radius: 2px;border-left-color: transparent;}.splitToolbarButtonSeparator {padding: 8px 0;width: 1px;background-color: hsla(0,0%,00%,.5);z-index: 99;box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);display: inline-block;margin: 5px 0;}html[dir='ltr'] .splitToolbarButtonSeparator {float:left;}html[dir='rtl'] .splitToolbarButtonSeparator {float:right;}.dropdownToolbarButton {min-width: 120px;max-width: 120px;padding: 4px 2px 4px;overflow: hidden;background: url(images/toolbarButton-menuArrows.png) no-repeat;}.dropdownToolbarButton > select {-webkit-appearance: none;-moz-appearance: none;min-width: 140px;font-size: 12px;color: hsl(0,0%,95%);margin:0;padding:0;border:none;background: rgba(0,0,0,0);}.dropdownToolbarButton > select > option {background: hsl(0,0%,24%);}#pageWidthOption {border-bottom: 1px rgba(255, 255, 255, .5) solid;}html[dir='ltr'] .dropdownToolbarButton {background-position: 95%;}html[dir='rtl'] .dropdownToolbarButton {background-position: 5%;}.toolbarButton.fullscreen::before {display: inline-block;content: url(images/toolbarButton-fullscreen.png);}.toolbarButton.presentation::before {display: inline-block;content: url(images/toolbarButton-presentation.png);}.toolbarButton.download::before {display: inline-block;content: url(images/toolbarButton-download.png);}.toolbarButton.about {color: #F2F2F2;font-size: 14px;font-weight: bold;line-height: 14px;font-family: sans-serif;}.toolbarButton.about::before {display: inline-block;}.toolbarButton.zoomOut::before {display: inline-block;content: url(images/toolbarButton-zoomOut.png);}.toolbarButton.zoomIn::before {display: inline-block;content: url(images/toolbarButton-zoomIn.png);}.toolbarButton.pageUp::before {display: inline-block;content: url(images/toolbarButton-pageUp.png);}.toolbarButton.pageDown::before {display: inline-block;content: url(images/toolbarButton-pageDown.png);}.toolbarField.pageNumber {min-width: 16px;text-align: right;width: 40px;}.toolbarField {padding: 3px 6px;margin: 4px 0 4px 0;border: 1px solid transparent;border-radius: 2px;background-color: hsla(0,0%,100%,.09);background-image: -moz-linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));background-clip: padding-box;border: 1px solid hsla(0,0%,0%,.35);border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,0 1px 0 hsla(0,0%,100%,.05);color: hsl(0,0%,95%);font-size: 12px;line-height: 14px;outline-style: none;-moz-transition-property: background-color, border-color, box-shadow;-moz-transition-duration: 150ms;-moz-transition-timing-function: ease;}.toolbarField.pageNumber::-webkit-inner-spin-button,.toolbarField.pageNumber::-webkit-outer-spin-button {-webkit-appearance: none;margin: 0;}.toolbarField:hover {background-color: hsla(0,0%,100%,.11);border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);}.toolbarField:focus {background-color: hsla(0,0%,100%,.15);border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);}.toolbarLabel {min-width: 16px;padding: 3px 6px 3px 2px;margin: 4px 2px 4px 0;border: 1px solid transparent;border-radius: 2px;color: hsl(0,0%,85%);font-size: 12px;line-height: 14px;text-align: left;-webkit-user-select:none;-moz-user-select:none;cursor: default;}#canvasContainer {overflow: auto;padding-top: 6px;padding-bottom: 6px;position: absolute;top: 32px;right: 0;bottom: 32px;left: 0;text-align: center;background-color: #888;background-image: url(images/texture.png);}#canvasContainer.slideshow {padding: 0;overflow: hidden;}#canvasContainer.slideshow > * {margin: auto;position: absolute;top: 0;left: 0;right: 0;bottom: 0;}.presentationMode {top: 0 !important;bottom: 0 !important;background-color: black !important;cursor: default !important;}#canvas {box-shadow:         0px 0px 7px rgba(0, 0, 0, 0.75);-webkit-box-shadow: 0px 0px 7px rgba(0, 0, 0, 0.75);-moz-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);-ms-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);-o-box-shadow:    0px 0px 7px rgba(0, 0, 0, 0.75);overflow: hidden;}#sliderContainer {visibility: hidden;}#overlayNavigator {position: absolute;width: 100%;height: 0;top: calc(50% - 50px);background-color: rgba(0, 0, 0, 0);z-index: 3;opacity: 0;-webkit-transition: opacity 1s ease-out;-moz-transition: opacity 1s ease-out;transition: opacity 1s ease-out;}#previousPage {float: left;margin-left: 10px;border-top: 50px solid transparent;border-bottom: 50px solid transparent;border-right: 50px solid black;opacity: 0.5;}#nextPage {float: right;margin-right: 10px;border-top: 50px solid transparent;border-bottom: 50px solid transparent;border-left: 50px solid black;opacity: 0.5;}#previousPage:active {opacity: 0.8;}#nextPage:active {opacity: 0.8;}#overlayCloseButton {position: absolute;top: 10px;right: 10px;z-index: 3;font-size: 35px;color: white;background-color: black;opacity: 0.5;width: 40px;height: 40px;-webkit-border-radius: 20px;-moz-border-radius: 20px;border-radius: 20px;text-align: center;cursor: pointer;display: none;}#overlayCloseButton:active {background-color: red;}#aboutDialogCentererTable {display: table;width:100%;height:100%;}#aboutDialogCentererCell {vertical-align: middle;text-align:center;display: table-cell;}#aboutDialog {width: 280px;background-color: #666;color: white;text-align: center;border-radius: 2px;box-shadow: 0px 1px 6px black;padding: 5px;font-style: sans-serif;display: inline-block;}#aboutDialog h1 {font-size: 25pt;}#aboutDialog p {font-size: 10pt;}#aboutDialog > * {margin: 10px;}#dialogOverlay {position: absolute;left: 0px;top: 0px;width:100%;height:100%;z-index: 3;background-color: rgba(0,0,0,.5);overflow: auto;display: none;}#blanked {display: none;cursor: none;position: absolute;left: 0px;top: 0px;width:100%;height:100%;z-index: 3;}";var viewerTouch_css="#canvasContainer {top: 0;bottom: 0;}#overlayNavigator {height: 100px;pointer-events: none;}#nextPage, #previousPage {pointer-events: all;}#titlebar, #toolbarContainer {background-color: rgba(0, 0, 0, 0.6);background-image: none;-webkit-transition: all 0.5s;-moz-transition: all 0.5s;transition: all 0.5s;}#titlebar {top: -32px;}#titlebar.viewer-touched {top: 0px;}#toolbarContainer {bottom: -32px;}#toolbarContainer.viewer-touched {bottom: 0px;}.viewer-touched {display: block;opacity: 1 !important;}#next, #previous {display: none;}";function Viewer(b,r){function f(){var a,c,d,e,g,f;f="undefined"!==String(typeof ViewerJS_version)?ViewerJS_version:"From Source";b&&(d=b.getPluginName(),e=b.getPluginVersion(),g=b.getPluginURL());a=document.createElement("div");a.id="aboutDialogCentererTable";c=document.createElement("div");c.id="aboutDialogCentererCell";I=document.createElement("div");I.id="aboutDialog";I.innerHTML='<h1>ViewerJS</h1><p>Open Source document viewer for webpages, built with HTML and JavaScript.</p><p>Learn more and get your own copy on the <a href="http://viewerjs.org/" target="_blank">ViewerJS website</a>.</p>'+
(b?'<p>Using the <a href = "'+g+'" target="_blank">'+d+'</a> (<span id = "pluginVersion">'+e+"</span>) plugin to show you this document.</p>":"")+"<p>Version "+f+'</p><p>Supported by <a href="https://nlnet.nl" target="_blank"><br><img src="images/nlnet.png" width="160" height="60" alt="NLnet Foundation"></a></p><p>Made by <a href="http://kogmbh.com" target="_blank"><br><img src="images/kogmbh.png" width="172" height="40" alt="KO GmbH"></a></p><button id = "aboutDialogCloseButton" class = "toolbarButton textButton">Close</button>';
K.appendChild(a);a.appendChild(c);c.appendChild(I);a=document.createElement("button");a.id="about";a.className="toolbarButton textButton about";a.title="About";a.innerHTML="ViewerJS";Q.appendChild(a);a.addEventListener("click",function(){K.style.display="block"});document.getElementById("aboutDialogCloseButton").addEventListener("click",function(){K.style.display="none"})}function x(a){var b=R.options,c,d=!1,e;for(e=0;e<b.length;e+=1)c=b[e],c.value!==a?c.selected=!1:d=c.selected=!0;return d}function s(a,
b){if(a!==g.getZoomLevel()){g.setZoomLevel(a);var c=document.createEvent("UIEvents");c.initUIEvent("scalechange",!1,!1,window,0);c.scale=a;c.resetAutoSettings=b;window.dispatchEvent(c)}}function k(){var a;if(b.onScroll)b.onScroll();b.getPageInView&&(a=b.getPageInView())&&(F=a,document.getElementById("pageNumber").value=a)}function q(a){window.clearTimeout(M);M=window.setTimeout(function(){k()},a)}function a(a,c){var d,e;if(d="custom"===a?parseFloat(document.getElementById("customScaleOption").textContent)/
100:parseFloat(a))s(d,!0);else{d=h.clientWidth-A;e=h.clientHeight-A;switch(a){case "page-actual":s(1,c);break;case "page-width":b.fitToWidth(d);break;case "page-height":b.fitToHeight(e);break;case "page-fit":b.fitToPage(d,e);break;case "auto":b.isSlideshow()?b.fitToPage(d+A,e+A):b.fitSmart(d)}x(a)}q(300)}function e(a){var b;return-1!==["auto","page-actual","page-width"].indexOf(a)?a:(b=parseFloat(a))&&y<=b&&b<=w?a:E}function c(a){a=parseInt(a,10);return isNaN(a)?1:a}function B(){D=!D;d&&!D&&g.togglePresentationMode()}
function t(){if(d||b.isSlideshow())n.className="viewer-touched",window.clearTimeout(N),N=window.setTimeout(function(){n.className=""},5E3)}function l(){C.classList.add("viewer-touched");G.classList.add("viewer-touched");window.clearTimeout(O);O=window.setTimeout(function(){z()},5E3)}function z(){C.classList.remove("viewer-touched");G.classList.remove("viewer-touched")}function u(){C.classList.contains("viewer-touched")?z():l()}function v(a){blanked.style.display="block";blanked.style.backgroundColor=
a;z()}function p(a,b){var c=document.getElementById(a);c.addEventListener("click",function(){b();c.blur()})}var g=this,A=40,y=0.25,w=4,E="auto",d=!1,D=!1,L=!1,J,m=document.getElementById("viewer"),h=document.getElementById("canvasContainer"),n=document.getElementById("overlayNavigator"),C=document.getElementById("titlebar"),G=document.getElementById("toolbarContainer"),P=document.getElementById("toolbarLeft"),S=document.getElementById("toolbarMiddleContainer"),R=document.getElementById("scaleSelect"),
K=document.getElementById("dialogOverlay"),Q=document.getElementById("toolbarRight"),I,H=[],F,M,N,O;this.initialize=function(){var d;d=e(r.zoom);J=r.documentUrl;document.title=r.title;var f=document.getElementById("documentName");f.innerHTML="";f.appendChild(f.ownerDocument.createTextNode(r.title));b.onLoad=function(){document.getElementById("pluginVersion").innerHTML=b.getPluginVersion();b.isSlideshow()?(h.classList.add("slideshow"),P.style.visibility="visible"):(S.style.visibility="visible",b.getPageInView&&
(P.style.visibility="visible"));L=!0;H=b.getPages();document.getElementById("numPages").innerHTML="of "+H.length;g.showPage(c(r.startpage));a(d);h.onscroll=k;q()};b.initialize(h,J)};this.showPage=function(a){0>=a?a=1:a>H.length&&(a=H.length);b.showPage(a);F=a;document.getElementById("pageNumber").value=F};this.showNextPage=function(){g.showPage(F+1)};this.showPreviousPage=function(){g.showPage(F-1)};this.download=function(){var a=J.split("#")[0];window.open(a+"#viewer.action=download","_parent")};
this.toggleFullScreen=function(){D?document.exitFullscreen?document.exitFullscreen():document.cancelFullScreen?document.cancelFullScreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen?document.webkitExitFullscreen():document.webkitCancelFullScreen?document.webkitCancelFullScreen():document.msExitFullscreen&&document.msExitFullscreen():m.requestFullscreen?m.requestFullscreen():m.mozRequestFullScreen?m.mozRequestFullScreen():m.webkitRequestFullscreen?m.webkitRequestFullscreen():
m.webkitRequestFullScreen?m.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT):m.msRequestFullscreen&&m.msRequestFullscreen()};this.togglePresentationMode=function(){var b=document.getElementById("overlayCloseButton");d?("block"===blanked.style.display&&(blanked.style.display="none",u()),C.style.display=G.style.display="block",b.style.display="none",h.classList.remove("presentationMode"),h.onmouseup=function(){},h.oncontextmenu=function(){},h.onmousedown=function(){},a("auto")):(C.style.display=
G.style.display="none",b.style.display="block",h.classList.add("presentationMode"),h.onmousedown=function(a){a.preventDefault()},h.oncontextmenu=function(a){a.preventDefault()},h.onmouseup=function(a){a.preventDefault();1===a.which?g.showNextPage():g.showPreviousPage()},a("page-fit"));d=!d};this.getZoomLevel=function(){return b.getZoomLevel()};this.setZoomLevel=function(a){b.setZoomLevel(a)};this.zoomOut=function(){var b=(g.getZoomLevel()/1.1).toFixed(2),b=Math.max(y,b);a(b,!0)};this.zoomIn=function(){var b=
(1.1*g.getZoomLevel()).toFixed(2),b=Math.min(w,b);a(b,!0)};(function(){f();b&&(g.initialize(),document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.webkitExitFullscreen||document.webkitCancelFullScreen||document.msExitFullscreen||(document.getElementById("fullscreen").style.visibility="hidden",document.getElementById("presentation").style.visibility="hidden"),p("overlayCloseButton",g.toggleFullScreen),p("fullscreen",g.toggleFullScreen),p("presentation",function(){D||
g.toggleFullScreen();g.togglePresentationMode()}),document.addEventListener("fullscreenchange",B),document.addEventListener("webkitfullscreenchange",B),document.addEventListener("mozfullscreenchange",B),document.addEventListener("MSFullscreenChange",B),p("download",g.download),p("zoomOut",g.zoomOut),p("zoomIn",g.zoomIn),p("previous",g.showPreviousPage),p("next",g.showNextPage),p("previousPage",g.showPreviousPage),p("nextPage",g.showNextPage),document.getElementById("pageNumber").addEventListener("change",
function(){g.showPage(this.value)}),document.getElementById("scaleSelect").addEventListener("change",function(){a(this.value)}),h.addEventListener("click",t),n.addEventListener("click",t),h.addEventListener("click",u),C.addEventListener("click",l),G.addEventListener("click",l),window.addEventListener("scalechange",function(a){var b=document.getElementById("customScaleOption"),c=x(String(a.scale));b.selected=!1;c||(b.textContent=Math.round(1E4*a.scale)/100+"%",b.selected=!0)},!0),window.addEventListener("resize",
function(b){L&&(document.getElementById("pageWidthOption").selected||document.getElementById("pageAutoOption").selected)&&a(document.getElementById("scaleSelect").value);t()}),window.addEventListener("keydown",function(a){var b=a.keyCode;a=a.shiftKey;if("block"===blanked.style.display)switch(b){case 16:case 17:case 18:case 91:case 93:case 224:case 225:break;default:blanked.style.display="none",u()}else switch(b){case 8:case 33:case 37:case 38:case 80:g.showPreviousPage();break;case 13:case 34:case 39:case 40:case 78:g.showNextPage();
break;case 32:a?g.showPreviousPage():g.showNextPage();break;case 66:case 190:d&&v("#000");break;case 87:case 188:d&&v("#FFF");break;case 36:g.showPage(1);break;case 35:g.showPage(H.length)}}))})()};(function(){function b(a,b){var c=new XMLHttpRequest;c.onreadystatechange=function(){var a,f;4===c.readyState&&((200<=c.status&&300>c.status||0===c.status)&&(a=c.getResponseHeader("content-type"))&&q.some(function(b){return b.supportsMimetype(a)?(f=b,console.log("Found plugin by mimetype and xhr head: "+a),!0):!1}),b(f))};c.open("HEAD",a,!0);c.send()}function r(a){var b;q.some(function(c){return c.supportsFileExtension(a)?(b=c,!0):!1});return b}function f(a){var b=r(a);b&&console.log("Found plugin by parameter type: "+
a);return b}function x(a){a=a.split("?")[0].split(".").pop();var b=r(a);b&&console.log("Found plugin by file extension from path: "+a);return b}function s(a){var b={};(a.search||"?").substr(1).split("&").forEach(function(a){a&&(a=a.split("=",2),b[decodeURIComponent(a[0])]=decodeURIComponent(a[1]))});return b}var k,q=[function(){var a="application/vnd.oasis.opendocument.text application/vnd.oasis.opendocument.text-flat-xml application/vnd.oasis.opendocument.text-template application/vnd.oasis.opendocument.presentation application/vnd.oasis.opendocument.presentation-flat-xml application/vnd.oasis.opendocument.presentation-template application/vnd.oasis.opendocument.spreadsheet application/vnd.oasis.opendocument.spreadsheet-flat-xml application/vnd.oasis.opendocument.spreadsheet-template".split(" "),
b="odt fodt ott odp fodp otp ods fods ots".split(" ");return{supportsMimetype:function(b){return-1!==a.indexOf(b)},supportsFileExtension:function(a){return-1!==b.indexOf(a)},path:"./ODFViewerPlugin",getClass:function(){return ODFViewerPlugin}}}(),{supportsMimetype:function(a){return"application/pdf"===a},supportsFileExtension:function(a){return"pdf"===a},path:"./PDFViewerPlugin",getClass:function(){return PDFViewerPlugin}}];window.onload=function(){var a=document.location.hash.substring(1),e=s(document.location),
c;a?(e.title||(e.title=a.replace(/^.*[\\\/]/,"")),e.documentUrl=a,b(a,function(b){b||(b=e.type?f(e.type):x(a));b?"undefined"!==String(typeof loadPlugin)?loadPlugin(b.path,function(){c=b.getClass();new Viewer(new c,e)}):(c=b.getClass(),new Viewer(new c,e)):new Viewer})):new Viewer};k=document.createElementNS(document.head.namespaceURI,"style");k.setAttribute("media","screen");k.setAttribute("type","text/css");k.appendChild(document.createTextNode(viewer_css));document.head.appendChild(k);k=document.createElementNS(document.head.namespaceURI,
"style");k.setAttribute("media","only screen and (max-device-width: 800px) and (max-device-height: 800px)");k.setAttribute("type","text/css");k.setAttribute("viewerTouch","1");k.appendChild(document.createTextNode(viewerTouch_css));document.head.appendChild(k)})();

//]]>
        </script>
        <!-- load some small tweaks for the Odoo integration /-->
        <script src="../../src/js/viewerjs_tweaks.js" type="text/javascript" charset="utf-8"></script>
    </head>

    <body>
        <div id = "viewer">
            <div id = "titlebar">
                <div id = "documentName"></div>
                <div id = "titlebarRight">
                    <button id = "presentation" class = "toolbarButton presentation" title = "Presentation"></button>
                    <button id = "fullscreen" class = "toolbarButton fullscreen" title = "Fullscreen"></button>
                    <button id = "download" class = "toolbarButton download" title = "Download"></button>
                </div>
           </div>
            <div id = "toolbarContainer">
                <div id = "toolbar">
                    <div id = "toolbarLeft">
                        <div id = "navButtons" class = "splitToolbarButton">
                            <button id = "previous" class = "toolbarButton pageUp" title = "Previous Page"></button>
                            <div class="splitToolbarButtonSeparator"></div>
                            <button id = "next" class = "toolbarButton pageDown" title = "Next Page"></button>
                        </div>
                        <label id = "pageNumberLabel" class = "toolbarLabel" for = "pageNumber">Page:</label>
                        <input type = "number" id = "pageNumber" class = "toolbarField pageNumber"/>
                        <span id = "numPages" class = "toolbarLabel"></span>
                    </div>
                    <div id = "toolbarMiddleContainer" class = "outerCenter">
                        <div id = "toolbarMiddle" class = "innerCenter">
                            <div id = 'zoomButtons' class = "splitToolbarButton">
                                <button id = "zoomOut" class = "toolbarButton zoomOut" title = "Zoom Out"></button>
                                <div class="splitToolbarButtonSeparator"></div>
                                <button id = "zoomIn" class = "toolbarButton zoomIn" title = "Zoom In"></button>
                            </div>
                            <span id="scaleSelectContainer" class="dropdownToolbarButton">
                                <select id="scaleSelect" title="Zoom" oncontextmenu="return false;">
                                    <option id="pageAutoOption" value="auto" selected>Automatic</option>
                                    <option id="pageActualOption" value="page-actual">Actual Size</option>
                                    <option id="pageWidthOption" value="page-width">Full Width</option>
                                    <option id="customScaleOption" value="custom"> </option>
                                    <option value="0.5">50%</option>
                                    <option value="0.75">75%</option>
                                    <option value="1">100%</option>
                                    <option value="1.25">125%</option>
                                    <option value="1.5">150%</option>
                                    <option value="2">200%</option>
                                </select>
                            </span>
                            <div id = "sliderContainer">
                                <div id = "slider"></div>
                            </div>
                        </div>
                    </div>
                    <div id = "toolbarRight">
                    </div>
                </div>
            </div>
            <div id = "canvasContainer">
                <div id = "canvas"></div>
            </div>
            <div id = "overlayNavigator">
                <div id = "previousPage"></div>
                <div id = "nextPage"></div>
            </div>
            <div id = "overlayCloseButton">
            &#10006;
            </div>
            <div id = "dialogOverlay"></div>
            <div id = "blanked"></div>
        </div>
    </body>
</html>


================================================
FILE: attachment_preview/static/lib/ViewerJS/pdf.js
================================================
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* Copyright 2012 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*jshint globalstrict: false */
/* globals PDFJS */

// Initializing PDFJS global object (if still undefined)
if (typeof PDFJS === 'undefined') {
  (typeof window !== 'undefined' ? window : this).PDFJS = {};
}

PDFJS.version = '1.1.114';
PDFJS.build = '3fd44fd';

(function pdfjsWrapper() {
  // Use strict in our context only - users might not want it
  'use strict';

/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
/* Copyright 2012 Mozilla Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
           Promise */

'use strict';

var globalScope = (typeof window === 'undefined') ? this : window;

var isWorker = (typeof window === 'undefined');

var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];

var TextRenderingMode = {
  FILL: 0,
  STROKE: 1,
  FILL_STROKE: 2,
  INVISIBLE: 3,
  FILL_ADD_TO_PATH: 4,
  STROKE_ADD_TO_PATH: 5,
  FILL_STROKE_ADD_TO_PATH: 6,
  ADD_TO_PATH: 7,
  FILL_STROKE_MASK: 3,
  ADD_TO_PATH_FLAG: 4
};

var ImageKind = {
  GRAYSCALE_1BPP: 1,
  RGB_24BPP: 2,
  RGBA_32BPP: 3
};

var AnnotationType = {
  WIDGET: 1,
  TEXT: 2,
  LINK: 3
};

var StreamType = {
  UNKNOWN: 0,
  FLATE: 1,
  LZW: 2,
  DCT: 3,
  JPX: 4,
  JBIG: 5,
  A85: 6,
  AHX: 7,
  CCF: 8,
  RL: 9
};

var FontType = {
  UNKNOWN: 0,
  TYPE1: 1,
  TYPE1C: 2,
  CIDFONTTYPE0: 3,
  CIDFONTTYPE0C: 4,
  TRUETYPE: 5,
  CIDFONTTYPE2: 6,
  TYPE3: 7,
  OPENTYPE: 8,
  TYPE0: 9,
  MMTYPE1: 10
};

// The global PDFJS object exposes the API
// In production, it will be declared outside a global wrapper
// In development, it will be declared here
if (!globalScope.PDFJS) {
  globalScope.PDFJS = {};
}

globalScope.PDFJS.pdfBug = false;

PDFJS.VERBOSITY_LEVELS = {
  errors: 0,
  warnings: 1,
  infos: 5
};

// All the possible operations for an operator list.
var OPS = PDFJS.OPS = {
  // Intentionally start from 1 so it is easy to spot bad operators that will be
  // 0's.
  dependency: 1,
  setLineWidth: 2,
  setLineCap: 3,
  setLineJoin: 4,
  setMiterLimit: 5,
  setDash: 6,
  setRenderingIntent: 7,
  setFlatness: 8,
  setGState: 9,
  save: 10,
  restore: 11,
  transform: 12,
  moveTo: 13,
  lineTo: 14,
  curveTo: 15,
  curveTo2: 16,
  curveTo3: 17,
  closePath: 18,
  rectangle: 19,
  stroke: 20,
  closeStroke: 21,
  fill: 22,
  eoFill: 23,
  fillStroke: 24,
  eoFillStroke: 25,
  closeFillStroke: 26,
  closeEOFillStroke: 27,
  endPath: 28,
  clip: 29,
  eoClip: 30,
  beginText: 31,
  endText: 32,
  setCharSpacing: 33,
  setWordSpacing: 34,
  setHScale: 35,
  setLeading: 36,
  setFont: 37,
  setTextRenderingMode: 38,
  setTextRise: 39,
  moveText: 40,
  setLeadingMoveText: 41,
  setTextMatrix: 42,
  nextLine: 43,
  showText: 44,
  showSpacedText: 45,
  nextLineShowText: 46,
  nextLineSetSpacingShowText: 47,
  setCharWidth: 48,
  setCharWidthAndBounds: 49,
  setStrokeColorSpace: 50,
  setFillColorSpace: 51,
  setStrokeColor: 52,
  setStrokeColorN: 53,
  setFillColor: 54,
  setFillColorN: 55,
  setStrokeGray: 56,
  setFillGray: 57,
  setStrokeRGBColor: 58,
  setFillRGBColor: 59,
  setStrokeCMYKColor: 60,
  setFillCMYKColor: 61,
  shadingFill: 62,
  beginInlineImage: 63,
  beginImageData: 64,
  endInlineImage: 65,
  paintXObject: 66,
  markPoint: 67,
  markPointProps: 68,
  beginMarkedContent: 69,
  beginMarkedContentProps: 70,
  endMarkedContent: 71,
  beginCompat: 72,
  endCompat: 73,
  paintFormXObjectBegin: 74,
  paintFormXObjectEnd: 75,
  beginGroup: 76,
  endGroup: 77,
  beginAnnotations: 78,
  endAnnotations: 79,
  beginAnnotation: 80,
  endAnnotation: 81,
  paintJpegXObject: 82,
  paintImageMaskXObject: 83,
  paintImageMaskXObjectGroup: 84,
  paintImageXObject: 85,
  paintInlineImageXObject: 86,
  paintInlineImageXObjectGroup: 87,
  paintImageXObjectRepeat: 88,
  paintImageMaskXObjectRepeat: 89,
  paintSolidColorImageMask: 90,
  constructPath: 91
};

// A notice for devs. These are good for things that are helpful to devs, such
// as warning that Workers were disabled, which is important to devs but not
// end users.
function info(msg) {
  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
    console.log('Info: ' + msg);
  }
}

// Non-fatal warnings.
function warn(msg) {
  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
    console.log('Warning: ' + msg);
  }
}

// Fatal errors that should trigger the fallback UI and halt execution by
// throwing an exception.
function error(msg) {
  if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.errors) {
    console.log('Error: ' + msg);
    console.log(backtrace());
  }
  UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
  throw new Error(msg);
}

function backtrace() {
  try {
    throw new Error();
  } catch (e) {
    return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
  }
}

function assert(cond, msg) {
  if (!cond) {
    error(msg);
  }
}

var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
  unknown: 'unknown',
  forms: 'forms',
  javaScript: 'javaScript',
  smask: 'smask',
  shadingPattern: 'shadingPattern',
  font: 'font'
};

var UnsupportedManager = PDFJS.UnsupportedManager =
  (function UnsupportedManagerClosure() {
  var listeners = [];
  return {
    listen: function (cb) {
      listeners.push(cb);
    },
    notify: function (featureId) {
      warn('Unsupported feature "' + featureId + '"');
      for (var i = 0, ii = listeners.length; i < ii; i++) {
        listeners[i](featureId);
      }
    }
  };
})();

// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
// absolute URL, it will be returned as is.
function combineUrl(baseUrl, url) {
  if (!url) {
    return baseUrl;
  }
  if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
    return url;
  }
  var i;
  if (url.charAt(0) === '/') {
    // absolute path
    i = baseUrl.indexOf('://');
    if (url.charAt(1) === '/') {
      ++i;
    } else {
      i = baseUrl.indexOf('/', i + 3);
    }
    return baseUrl.substring(0, i) + url;
  } else {
    // relative path
    var pathLength = baseUrl.length;
    i = baseUrl.lastIndexOf('#');
    pathLength = i >= 0 ? i : pathLength;
    i = baseUrl.lastIndexOf('?', pathLength);
    pathLength = i >= 0 ? i : pathLength;
    var prefixLength = baseUrl.lastIndexOf('/', pathLength);
    return baseUrl.substring(0, prefixLength + 1) + url;
  }
}

// Validates if URL is safe and allowed, e.g. to avoid XSS.
function isValidUrl(url, allowRelative) {
  if (!url) {
    return false;
  }
  // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
  // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
  var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
  if (!protocol) {
    return allowRelative;
  }
  protocol = protocol[0].toLowerCase();
  switch (protocol) {
    case 'http':
    case 'https':
    case 'ftp':
    case 'mailto':
    case 'tel':
      return true;
    default:
      return false;
  }
}
PDFJS.isValidUrl = isValidUrl;

function shadow(obj, prop, value) {
  Object.defineProperty(obj, prop, { value: value,
                                     enumerable: true,
                                     configurable: true,
                                     writable: false });
  return value;
}
PDFJS.shadow = shadow;

var PasswordResponses = PDFJS.PasswordResponses = {
  NEED_PASSWORD: 1,
  INCORRECT_PASSWORD: 2
};

var PasswordException = (function PasswordExceptionClosure() {
  function PasswordException(msg, code) {
    this.name = 'PasswordException';
    this.message = msg;
    this.code = code;
  }

  PasswordException.prototype = new Error();
  PasswordException.constructor = PasswordException;

  return PasswordException;
})();
PDFJS.PasswordException = PasswordException;

var UnknownErrorException = (function UnknownErrorExceptionClosure() {
  function UnknownErrorException(msg, details) {
    this.name = 'UnknownErrorException';
    this.message = msg;
    this.details = details;
  }

  UnknownErrorException.prototype = new Error();
  UnknownErrorException.constructor = UnknownErrorException;

  return UnknownErrorException;
})();
PDFJS.UnknownErrorException = UnknownErrorException;

var InvalidPDFException = (function InvalidPDFExceptionClosure() {
  function InvalidPDFException(msg) {
    this.name = 'InvalidPDFException';
    this.message = msg;
  }

  InvalidPDFException.prototype = new Error();
  InvalidPDFException.constructor = InvalidPDFException;

  return InvalidPDFException;
})();
PDFJS.InvalidPDFException = InvalidPDFException;

var MissingPDFException = (function MissingPDFExceptionClosure() {
  function MissingPDFException(msg) {
    this.name = 'MissingPDFException';
    this.message = msg;
  }

  MissingPDFException.prototype = new Error();
  MissingPDFException.constructor = MissingPDFException;

  return MissingPDFException;
})();
PDFJS.MissingPDFException = MissingPDFException;

var UnexpectedResponseException =
    (function UnexpectedResponseExceptionClosure() {
  function UnexpectedResponseException(msg, status) {
    this.name = 'UnexpectedResponseException';
    this.message = msg;
    this.status = status;
  }

  UnexpectedResponseException.prototype = new Error();
  UnexpectedResponseException.constructor = UnexpectedResponseException;

  return UnexpectedResponseException;
})();
PDFJS.UnexpectedResponseException = UnexpectedResponseException;

var NotImplementedException = (function NotImplementedExceptionClosure() {
  function NotImplementedException(msg) {
    this.message = msg;
  }

  NotImplementedException.prototype = new Error();
  NotImplementedException.prototype.name = 'NotImplementedException';
  NotImplementedException.constructor = NotImplementedException;

  return NotImplementedException;
})();

var MissingDataException = (function MissingDataExceptionClosure() {
  function MissingDataException(begin, end) {
    this.begin = begin;
    this.end = end;
    this.message = 'Missing data [' + begin + ', ' + end + ')';
  }

  MissingDataException.prototype = new Error();
  MissingDataException.prototype.name = 'MissingDataException';
  MissingDataException.constructor = MissingDataException;

  return MissingDataException;
})();

var XRefParseException = (function XRefParseExceptionClosure() {
  function XRefParseException(msg) {
    this.message = msg;
  }

  XRefParseException.prototype = new Error();
  XRefParseException.prototype.name = 'XRefParseException';
  XRefParseException.constructor = XRefParseException;

  return XRefParseException;
})();


function bytesToString(bytes) {
  assert(bytes !== null && typeof bytes === 'object' &&
         bytes.length !== undefined, 'Invalid argument for bytesToString');
  var length = bytes.length;
  var MAX_ARGUMENT_COUNT = 8192;
  if (length < MAX_ARGUMENT_COUNT) {
    return String.fromCharCode.apply(null, bytes);
  }
  var strBuf = [];
  for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
    var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
    var chunk = bytes.subarray(i, chunkEnd);
    strBuf.push(String.fromCharCode.apply(null, chunk));
  }
  return strBuf.join('');
}

function stringToBytes(str) {
  assert(typeof str === 'string', 'Invalid argument for stringToBytes');
  var length = str.length;
  var bytes = new Uint8Array(length);
  for (var i = 0; i < length; ++i) {
    bytes[i] = str.charCodeAt(i) & 0xFF;
  }
  return bytes;
}

function string32(value) {
  return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
                             (value >> 8) & 0xff, value & 0xff);
}

function log2(x) {
  var n = 1, i = 0;
  while (x > n) {
    n <<= 1;
    i++;
  }
  return i;
}

function readInt8(data, start) {
  return (data[start] << 24) >> 24;
}

function readUint16(data, offset) {
  return (data[offset] << 8) | data[offset + 1];
}

function readUint32(data, offset) {
  return ((data[offset] << 24) | (data[offset + 1] << 16) |
         (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
}

// Lazy test the endianness of the platform
// NOTE: This will be 'true' for simulated TypedArrays
function isLittleEndian() {
  var buffer8 = new Uint8Array(2);
  buffer8[0] = 1;
  var buffer16 = new Uint16Array(buffer8.buffer);
  return (buffer16[0] === 1);
}

Object.defineProperty(PDFJS, 'isLittleEndian', {
  configurable: true,
  get: function PDFJS_isLittleEndian() {
    return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
  }
});

//#if !(FIREFOX || MOZCENTRAL || B2G || CHROME)
//// Lazy test if the userAgant support CanvasTypedArrays
function hasCanvasTypedArrays() {
  var canvas = document.createElement('canvas');
  canvas.width = canvas.height = 1;
  var ctx = canvas.getContext('2d');
  var imageData = ctx.createImageData(1, 1);
  return (typeof imageData.data.buffer !== 'undefined');
}

Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
  configurable: true,
  get: function PDFJS_hasCanvasTypedArrays() {
    return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
  }
});

var Uint32ArrayView = (function Uint32ArrayViewClosure() {

  function Uint32ArrayView(buffer, length) {
    this.buffer = buffer;
    this.byteLength = buffer.length;
    this.length = length === undefined ? (this.byteLength >> 2) : length;
    ensureUint32ArrayViewProps(this.length);
  }
  Uint32ArrayView.prototype = Object.create(null);

  var uint32ArrayViewSetters = 0;
  function createUint32ArrayProp(index) {
    return {
      get: function () {
        var buffer = this.buffer, offset = index << 2;
        return (buffer[offset] | (buffer[offset + 1] << 8) |
          (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
      },
      set: function (value) {
        var buffer = this.buffer, offset = index << 2;
        buffer[offset] = value & 255;
        buffer[offset + 1] = (value >> 8) & 255;
        buffer[offset + 2] = (value >> 16) & 255;
        buffer[offset + 3] = (value >>> 24) & 255;
      }
    };
  }

  function ensureUint32ArrayViewProps(length) {
    while (uint32ArrayViewSetters < length) {
      Object.defineProperty(Uint32ArrayView.prototype,
        uint32ArrayViewSetters,
        createUint32ArrayProp(uint32ArrayViewSetters));
      uint32ArrayViewSetters++;
    }
  }

  return Uint32ArrayView;
})();
//#else
//PDFJS.hasCanvasTypedArrays = true;
//#endif

var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];

var Util = PDFJS.Util = (function UtilClosure() {
  function Util() {}

  var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];

  // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
  // creating many intermediate strings.
  Util.makeCssRgb = function Util_makeCssRgb(r, g, b) {
    rgbBuf[1] = r;
    rgbBuf[3] = g;
    rgbBuf[5] = b;
    return rgbBuf.join('');
  };

  // Concatenates two transformation matrices together and returns the result.
  Util.transform = function Util_transform(m1, m2) {
    return [
      m1[0] * m2[0] + m1[2] * m2[1],
      m1[1] * m2[0] + m1[3] * m2[1],
      m1[0] * m2[2] + m1[2] * m2[3],
      m1[1] * m2[2] + m1[3] * m2[3],
      m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
      m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
    ];
  };

  // For 2d affine transforms
  Util.applyTransform = function Util_applyTransform(p, m) {
    var xt = p[0] * m[0] + p[1] * m[2] + m[4];
    var yt = p[0] * m[1] + p[1] * m[3] + m[5];
    return [xt, yt];
  };

  Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
    var d = m[0] * m[3] - m[1] * m[2];
    var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
    var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
    return [xt, yt];
  };

  // Applies the transform to the rectangle and finds the minimum axially
  // aligned bounding box.
  Util.getAxialAlignedBoundingBox =
    function Util_getAxialAlignedBoundingBox(r, m) {

    var p1 = Util.applyTransform(r, m);
    var p2 = Util.applyTransform(r.slice(2, 4), m);
    var p3 = Util.applyTransform([r[0], r[3]], m);
    var p4 = Util.applyTransform([r[2], r[1]], m);
    return [
      Math.min(p1[0], p2[0], p3[0], p4[0]),
      Math.min(p1[1], p2[1], p3[1], p4[1]),
      Math.max(p1[0], p2[0], p3[0], p4[0]),
      Math.max(p1[1], p2[1], p3[1], p4[1])
    ];
  };

  Util.inverseTransform = function Util_inverseTransform(m) {
    var d = m[0] * m[3] - m[1] * m[2];
    return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
      (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
  };

  // Apply a generic 3d matrix M on a 3-vector v:
  //   | a b c |   | X |
  //   | d e f | x | Y |
  //   | g h i |   | Z |
  // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
  // with v as [X,Y,Z]
  Util.apply3dTransform = function Util_apply3dTransform(m, v) {
    return [
      m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
      m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
      m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
    ];
  };

  // This calculation uses Singular Value Decomposition.
  // The SVD can be represented with formula A = USV. We are interested in the
  // matrix S here because it represents the scale values.
  Util.singularValueDecompose2dScale =
    function Util_singularValueDecompose2dScale(m) {

    var transpose = [m[0], m[2], m[1], m[3]];

    // Multiply matrix m with its transpose.
    var a = m[0] * transpose[0] + m[1] * transpose[2];
    var b = m[0] * transpose[1] + m[1] * transpose[3];
    var c = m[2] * transpose[0] + m[3] * transpose[2];
    var d = m[2] * transpose[1] + m[3] * transpose[3];

    // Solve the second degree polynomial to get roots.
    var first = (a + d) / 2;
    var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
    var sx = first + second || 1;
    var sy = first - second || 1;

    // Scale values are the square roots of the eigenvalues.
    return [Math.sqrt(sx), Math.sqrt(sy)];
  };

  // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
  // For coordinate systems whose origin lies in the bottom-left, this
  // means normalization to (BL,TR) ordering. For systems with origin in the
  // top-left, this means (TL,BR) ordering.
  Util.normalizeRect = function Util_normalizeRect(rect) {
    var r = rect.slice(0); // clone rect
    if (rect[0] > rect[2]) {
      r[0] = rect[2];
      r[2] = rect[0];
    }
    if (rect[1] > rect[3]) {
      r[1] = rect[3];
      r[3] = rect[1];
    }
    return r;
  };

  // Returns a rectangle [x1, y1, x2, y2] corresponding to the
  // intersection of rect1 and rect2. If no intersection, returns 'false'
  // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
  Util.intersect = function Util_intersect(rect1, rect2) {
    function compare(a, b) {
      return a - b;
    }

    // Order points along the axes
    var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
        orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
        result = [];

    rect1 = Util.normalizeRect(rect1);
    rect2 = Util.normalizeRect(rect2);

    // X: first and second points belong to different rectangles?
    if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
        (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
      // Intersection must be between second and third points
      result[0] = orderedX[1];
      result[2] = orderedX[2];
    } else {
      return false;
    }

    // Y: first and second points belong to different rectangles?
    if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
        (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
      // Intersection must be between second and third points
      result[1] = orderedY[1];
      result[3] = orderedY[2];
    } else {
      return false;
    }

    return result;
  };

  Util.sign = function Util_sign(num) {
    return num < 0 ? -1 : 1;
  };

  Util.appendToArray = function Util_appendToArray(arr1, arr2) {
    Array.prototype.push.apply(arr1, arr2);
  };

  Util.prependToArray = function Util_prependToArray(arr1, arr2) {
    Array.prototype.unshift.apply(arr1, arr2);
  };

  Util.extendObj = function extendObj(obj1, obj2) {
    for (var key in obj2) {
      obj1[key] = obj2[key];
    }
  };

  Util.getInheritableProperty = function Util_getInheritableProperty(dict,
                                                                     name) {
    while (dict && !dict.has(name)) {
      dict = dict.get('Parent');
    }
    if (!dict) {
      return null;
    }
    return dict.get(name);
  };

  Util.inherit = function Util_inherit(sub, base, prototype) {
    sub.prototype = Object.create(base.prototype);
    sub.prototype.constructor = sub;
    for (var prop in prototype) {
      sub.prototype[prop] = prototype[prop];
    }
  };

  Util.loadScript = function Util_loadScript(src, callback) {
    var script = document.createElement('script');
    var loaded = false;
    script.setAttribute('src', src);
    if (callback) {
      script.onload = function() {
        if (!loaded) {
          callback();
        }
        loaded = true;
      };
    }
    document.getElementsByTagName('head')[0].appendChild(script);
  };

  return Util;
})();

/**
 * PDF page viewport created based on scale, rotation and offset.
 * @class
 * @alias PDFJS.PageViewport
 */
var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
  /**
   * @constructor
   * @private
   * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.
   * @param scale {number} scale of the viewport.
   * @param rotation {number} rotations of the viewport in degrees.
   * @param offsetX {number} offset X
   * @param offsetY {number} offset Y
   * @param dontFlip {boolean} if true, axis Y will not be flipped.
   */
  function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
    this.viewBox = viewBox;
    this.scale = scale;
    this.rotation = rotation;
    this.offsetX = offsetX;
    this.offsetY = offsetY;

    // creating transform to convert pdf coordinate system to the normal
    // canvas like coordinates taking in account scale and rotation
    var centerX = (viewBox[2] + viewBox[0]) / 2;
    var centerY = (viewBox[3] + viewBox[1]) / 2;
    var rotateA, rotateB, rotateC, rotateD;
    rotation = rotation % 360;
    rotation = rotation < 0 ? rotation + 360 : rotation;
    switch (rotation) {
      case 180:
        rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
        break;
      case 90:
        rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
        break;
      case 270:
        rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
        break;
      //case 0:
      default:
        rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
        break;
    }

    if (dontFlip) {
      rotateC = -rotateC; rotateD = -rotateD;
    }

    var offsetCanvasX, offsetCanvasY;
    var width, height;
    if (rotateA === 0) {
      offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
      offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
      width = Math.abs(viewBox[3] - viewBox[1]) * scale;
      height = Math.abs(viewBox[2] - viewBox[0]) * scale;
    } else {
      offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
      offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
      width = Math.abs(viewBox[2] - viewBox[0]) * scale;
      height = Math.abs(viewBox[3] - viewBox[1]) * scale;
    }
    // creating transform for the following operations:
    // translate(-centerX, -centerY), rotate and flip vertically,
    // scale, and translate(offsetCanvasX, offsetCanvasY)
    this.transform = [
      rotateA * scale,
      rotateB * scale,
      rotateC * scale,
      rotateD * scale,
      offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
      offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
    ];

    this.width = width;
    this.height = height;
    this.fontScale = scale;
  }
  PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {
    /**
     * Clones viewport with additional properties.
     * @param args {Object} (optional) If specified, may contain the 'scale' or
     * 'rotation' properties to override the corresponding properties in
     * the cloned viewport.
     * @returns {PDFJS.PageViewport} Cloned viewport.
     */
    clone: function PageViewPort_clone(args) {
      args = args || {};
      var scale = 'scale' in args ? args.scale : this.scale;
      var rotation = 'rotation' in args ? args.rotation : this.rotation;
      return new PageViewport(this.viewBox.slice(), scale, rotation,
                              this.offsetX, this.offsetY, args.dontFlip);
    },
    /**
     * Converts PDF point to the viewport coordinates. For examples, useful for
     * converting PDF location into canvas pixel coordinates.
     * @param x {number} X coordinate.
     * @param y {number} Y coordinate.
     * @returns {Object} Object that contains 'x' and 'y' properties of the
     * point in the viewport coordinate space.
     * @see {@link convertToPdfPoint}
     * @see {@link convertToViewportRectangle}
     */
    convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
      return Util.applyTransform([x, y], this.transform);
    },
    /**
     * Converts PDF rectangle to the viewport coordinates.
     * @param rect {Array} xMin, yMin, xMax and yMax coordinates.
     * @returns {Array} Contains corresponding coordinates of the rectangle
     * in the viewport coordinate space.
     * @see {@link convertToViewportPoint}
     */
    convertToViewportRectangle:
      function PageViewport_convertToViewportRectangle(rect) {
      var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
      var br = Util.applyTransform([rect[2], rect[3]], this.transform);
      return [tl[0], tl[1], br[0], br[1]];
    },
    /**
     * Converts viewport coordinates to the PDF location. For examples, useful
     * for converting canvas pixel location into PDF one.
     * @param x {number} X coordinate.
     * @param y {number} Y coordinate.
     * @returns {Object} Object that contains 'x' and 'y' properties of the
     * point in the PDF coordinate space.
     * @see {@link convertToViewportPoint}
     */
    convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
      return Util.applyInverseTransform([x, y], this.transform);
    }
  };
  return PageViewport;
})();

var PDFStringTranslateTable = [
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
  0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
  0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
  0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
];

function stringToPDFString(str) {
  var i, n = str.length, strBuf = [];
  if (str[0] === '\xFE' && str[1] === '\xFF') {
    // UTF16BE BOM
    for (i = 2; i < n; i += 2) {
      strBuf.push(String.fromCharCode(
        (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
    }
  } else {
    for (i = 0; i < n; ++i) {
      var code = PDFStringTranslateTable[str.charCodeAt(i)];
      strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
    }
  }
  return strBuf.join('');
}

function stringToUTF8String(str) {
  return decodeURIComponent(escape(str));
}

function isEmptyObj(obj) {
  for (var key in obj) {
    return false;
  }
  return true;
}

function isBool(v) {
  return typeof v === 'boolean';
}

function isInt(v) {
  return typeof v === 'number' && ((v | 0) === v);
}

function isNum(v) {
  return typeof v === 'number';
}

function isString(v) {
  return typeof v === 'string';
}

function isName(v) {
  return v instanceof Name;
}

function isCmd(v, cmd) {
  return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
}

function isDict(v, type) {
  if (!(v instanceof Dict)) {
    return false;
  }
  if (!type) {
    return true;
  }
  var dictType = v.get('Type');
  return isName(dictType) && dictType.name === type;
}

function isArray(v) {
  return v instanceof Array;
}

function isStream(v) {
  return typeof v === 'object' && v !== null && v.getBytes !== undefined;
}

function isArrayBuffer(v) {
  return typeof v === 'object' && v !== null && v.byteLength !== undefined;
}

function isRef(v) {
  return v instanceof Ref;
}

/**
 * Promise Capability object.
 *
 * @typedef {Object} PromiseCapability
 * @property {Promise} promise - A promise object.
 * @property {function} resolve - Fullfills the promise.
 * @property {function} reject - Rejects the promise.
 */

/**
 * Creates a promise capability object.
 * @alias PDFJS.createPromiseCapability
 *
 * @return {PromiseCapability} A capability object contains:
 * - a Promise, resolve and reject methods.
 */
function createPromiseCapability() {
  var capability = {};
  capability.promise = new Promise(function (resolve, reject) {
    capability.resolve = resolve;
    capability.reject = reject;
  });
  return capability;
}

PDFJS.createPromiseCapability = createPromiseCapability;

/**
 * Polyfill for Promises:
 * The following promise implementation tries to generally implement the
 * Promise/A+ spec. Some notable differences from other promise libaries are:
 * - There currently isn't a seperate deferred and promise object.
 * - Unhandled rejections eventually show an error if they aren't handled.
 *
 * Based off of the work in:
 * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
 */
(function PromiseClosure() {
  if (globalScope.Promise) {
    // Promises existing in the DOM/Worker, checking presence of all/resolve
    if (typeof globalScope.Promise.all !== 'function') {
      globalScope.Promise.all = function (iterable) {
        var count = 0, results = [], resolve, reject;
        var promise = new globalScope.Promise(function (resolve_, reject_) {
          resolve = resolve_;
          reject = reject_;
        });
        iterable.forEach(function (p, i) {
          count++;
          p.then(function (result) {
            results[i] = result;
            count--;
            if (count === 0) {
              resolve(results);
         
Download .txt
gitextract_5g2yh69w/

├── .copier-answers.yml
├── .editorconfig
├── .github/
│   └── workflows/
│       ├── pre-commit.yml
│       ├── stale.yml
│       └── test.yml
├── .gitignore
├── .pre-commit-config.yaml
├── .pylintrc
├── .pylintrc-mandatory
├── .ruff.toml
├── LICENSE
├── README.md
├── attachment_preview/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── attachment_preview.pot
│   │   ├── de.po
│   │   ├── es.po
│   │   ├── gl.po
│   │   ├── it.po
│   │   ├── nl.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── sl.po
│   │   ├── tr.po
│   │   ├── vi_VN.po
│   │   └── zh_CN.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── ir_attachment.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   ├── lib/
│   │   │   └── ViewerJS/
│   │   │       ├── compatibility.js
│   │   │       ├── example.local.css
│   │   │       ├── index.html
│   │   │       ├── pdf.js
│   │   │       ├── pdf.worker.js
│   │   │       ├── pdfjsversion.js
│   │   │       ├── text_layer_builder.js
│   │   │       ├── ui_utils.js
│   │   │       └── webodf.js
│   │   └── src/
│   │       ├── js/
│   │       │   ├── attachmentPreviewWidget.esm.js
│   │       │   ├── mail_core/
│   │       │   │   └── attachment_list.esm.js
│   │       │   ├── utils.esm.js
│   │       │   ├── viewerjs_tweaks.js
│   │       │   └── web_views/
│   │       │       ├── fields/
│   │       │       │   └── binary_field.esm.js
│   │       │       └── form/
│   │       │           ├── form_compiler.esm.js
│   │       │           ├── form_controller.esm.js
│   │       │           └── form_renderer.esm.js
│   │       ├── scss/
│   │       │   └── attachment_preview.scss
│   │       └── xml/
│   │           └── attachment_preview.xml
│   └── tests/
│       ├── __init__.py
│       └── test_attachment_preview.py
├── attachment_zipped_download/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── controllers/
│   │   ├── __init__.py
│   │   └── main.py
│   ├── i18n/
│   │   ├── attachment_zipped_download.pot
│   │   ├── es.po
│   │   ├── fr.po
│   │   ├── gl.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   ├── pt.po
│   │   └── pt_BR.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── ir_attachment.py
│   │   └── ir_attachment_action_download.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── models/
│   │   │   ├── __init__.py
│   │   │   └── res_partner.py
│   │   ├── test_attachment_zipped_download.py
│   │   └── test_ir_attachment_action_download.py
│   └── views/
│       └── ir_attachment_view.xml
├── checklog-odoo.cfg
├── document_knowledge/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── data/
│   │   ├── ir_module_category.xml
│   │   └── res_users.xml
│   ├── demo/
│   │   └── document_knowledge.xml
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_knowledge.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── he_IL.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── knowledge.pot
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── ir_attachment.py
│   │   └── res_config.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── CREDITS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── document_knowledge_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   └── views/
│       ├── document_knowledge.xml
│       └── res_config.xml
├── document_page/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── demo/
│   │   └── document_page.xml
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── he_IL.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sq.po
│   │   ├── sr.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tlh.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   ├── document_page_history.py
│   │   └── ir_ui_menu.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── CREDITS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── security/
│   │   ├── document_page_security.xml
│   │   └── ir.model.access.csv
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       ├── js/
│   │       │   ├── document_page_kanban_controller.esm.js
│   │       │   └── document_page_kanban_view.esm.js
│   │       └── scss/
│   │           ├── document_page.scss
│   │           └── document_page_variables.scss
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_document_page.py
│   │   ├── test_document_page_create_menu.py
│   │   ├── test_document_page_history.py
│   │   └── test_document_page_show_diff.py
│   ├── views/
│   │   ├── document_page.xml
│   │   ├── document_page_category.xml
│   │   ├── document_page_history.xml
│   │   └── report_document_page.xml
│   └── wizard/
│       ├── __init__.py
│       ├── document_page_create_menu.py
│       ├── document_page_create_menu.xml
│       ├── document_page_show_diff.py
│       └── document_page_show_diff.xml
├── document_page_access_group/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── ca.po
│   │   ├── document_page_access_group.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt_BR.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── common.py
│   │   └── test_document_page_access_group.py
│   └── views/
│       └── document_page.xml
├── document_page_access_group_user_role/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_access_group_user_role.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_access_group_user_role.py
│   └── views/
│       └── document_page_views.xml
├── document_page_approval/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── data/
│   │   └── email_template.xml
│   ├── hooks.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page_approval.pot
│   │   ├── el.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── document_page_history.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── document_page_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_approval.py
│   └── views/
│       └── document_page_approval.xml
├── document_page_group/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── ca.po
│   │   ├── document_page_group.pot
│   │   ├── es.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   ├── pt.po
│   │   └── sl.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   └── DESCRIPTION.md
│   ├── security/
│   │   └── document_page_security.xml
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_group.py
│   └── views/
│       └── document_page.xml
├── document_page_partner/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── de.po
│   │   ├── document_page_partner.pot
│   │   ├── document_page_partner_id.pot
│   │   ├── es.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   └── views/
│       └── document_page.xml
├── document_page_product/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_product.pot
│   │   ├── es.po
│   │   └── it.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── product.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_product.py
│   └── views/
│       ├── document_page_views.xml
│       ├── product_product_views.xml
│       └── product_template_views.xml
├── document_page_project/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_project.pot
│   │   ├── es.po
│   │   ├── he_IL.po
│   │   ├── hr.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── project_project.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_project_project.py
│   └── views/
│       ├── document_page_views.xml
│       └── project_project_views.xml
├── document_page_project_task/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_project_task.pot
│   │   └── it.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── project_task.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   ├── test_document_page.py
│   │   └── test_project_task.py
│   └── views/
│       ├── document_page_views.xml
│       └── project_task_views.xml
├── document_page_reference/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── document_page_reference.pot
│   │   ├── es.po
│   │   ├── gl.po
│   │   ├── it.po
│   │   └── pt.po
│   ├── migrations/
│   │   └── 18.0.1.1.0/
│   │       └── post-migration.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── document_page.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       └── js/
│   │           └── editor.esm.js
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_reference.py
│   └── views/
│       ├── document_page.xml
│       └── report_document_page.xml
├── document_page_tag/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── ca_ES.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_page_tag.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PE.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── fr_CH.po
│   │   ├── gl.po
│   │   ├── gl_ES.po
│   │   ├── he.po
│   │   ├── hr.po
│   │   ├── hr_HR.po
│   │   ├── hu.po
│   │   ├── id.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ko.po
│   │   ├── lt.po
│   │   ├── lt_LT.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nb_NO.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── nl_NL.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── tr_TR.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── vi_VN.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   ├── document_page.py
│   │   └── document_page_tag.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONFIGURE.md
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   ├── INSTALL.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── ir.model.access.csv
│   ├── static/
│   │   └── description/
│   │       └── index.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_page_tag.py
│   └── views/
│       ├── document_page.xml
│       └── document_page_tag.xml
├── document_url/
│   ├── README.rst
│   ├── __init__.py
│   ├── __manifest__.py
│   ├── i18n/
│   │   ├── am.po
│   │   ├── ar.po
│   │   ├── bg.po
│   │   ├── bs.po
│   │   ├── ca.po
│   │   ├── cs.po
│   │   ├── da.po
│   │   ├── de.po
│   │   ├── document_url.pot
│   │   ├── el.po
│   │   ├── el_GR.po
│   │   ├── en_AU.po
│   │   ├── en_GB.po
│   │   ├── es.po
│   │   ├── es_AR.po
│   │   ├── es_CL.po
│   │   ├── es_CO.po
│   │   ├── es_CR.po
│   │   ├── es_DO.po
│   │   ├── es_EC.po
│   │   ├── es_ES.po
│   │   ├── es_MX.po
│   │   ├── es_PY.po
│   │   ├── es_VE.po
│   │   ├── et.po
│   │   ├── eu.po
│   │   ├── fa.po
│   │   ├── fi.po
│   │   ├── fr.po
│   │   ├── fr_CA.po
│   │   ├── gl.po
│   │   ├── gu.po
│   │   ├── he.po
│   │   ├── hi.po
│   │   ├── hr.po
│   │   ├── hu.po
│   │   ├── hy.po
│   │   ├── id.po
│   │   ├── is.po
│   │   ├── it.po
│   │   ├── ja.po
│   │   ├── ka.po
│   │   ├── kab.po
│   │   ├── kk.po
│   │   ├── ko.po
│   │   ├── ln.po
│   │   ├── lo.po
│   │   ├── lt.po
│   │   ├── lv.po
│   │   ├── mk.po
│   │   ├── mn.po
│   │   ├── nb.po
│   │   ├── nl.po
│   │   ├── nl_BE.po
│   │   ├── pl.po
│   │   ├── pt.po
│   │   ├── pt_BR.po
│   │   ├── pt_PT.po
│   │   ├── ro.po
│   │   ├── ru.po
│   │   ├── sk.po
│   │   ├── sl.po
│   │   ├── sr.po
│   │   ├── sr@latin.po
│   │   ├── sv.po
│   │   ├── th.po
│   │   ├── tr.po
│   │   ├── uk.po
│   │   ├── vi.po
│   │   ├── zh_CN.po
│   │   └── zh_TW.po
│   ├── models/
│   │   ├── __init__.py
│   │   └── ir_attachment.py
│   ├── pyproject.toml
│   ├── readme/
│   │   ├── CONTRIBUTORS.md
│   │   ├── DESCRIPTION.md
│   │   └── USAGE.md
│   ├── security/
│   │   └── ir.model.access.csv
│   ├── static/
│   │   ├── description/
│   │   │   └── index.html
│   │   └── src/
│   │       ├── js/
│   │       │   └── url.esm.js
│   │       ├── scss/
│   │       │   └── document_url.scss
│   │       └── xml/
│   │           └── url.xml
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_document_url.py
│   ├── view/
│   │   └── document_url_view.xml
│   └── wizard/
│       ├── __init__.py
│       └── document_url.py
├── eslint.config.cjs
├── prettier.config.cjs
├── setup/
│   ├── _metapackage/
│   │   └── pyproject.toml
│   └── document_page_project_task/
│       └── setup.py
└── test-requirements.txt
Download .txt
SYMBOL INDEX (1392 symbols across 66 files)

FILE: attachment_preview/models/ir_attachment.py
  class IrAttachment (line 16) | class IrAttachment(models.Model):
    method get_binary_extension (line 20) | def get_binary_extension(self, model, ids, binary_field, filename_fiel...
    method get_attachment_extension (line 76) | def get_attachment_extension(self, ids):
    method _to_store (line 79) | def _to_store(self, store: Store, /, *, fields=None, extra_fields=None):

FILE: attachment_preview/static/lib/ViewerJS/compatibility.js
  function subarray (line 48) | function subarray(start, end) {
  function setArrayOffset (line 52) | function setArrayOffset(array, offset) {
  function TypedArray (line 61) | function TypedArray(arg1) {
  method id (line 119) | get id() { }
  function changeList (line 339) | function changeList(element, itemName, add, remove) {
  function ignoreIfTargetDisabled (line 425) | function ignoreIfTargetDisabled(event) {
  function isDisabled (line 430) | function isDisabled(node) {
  function fakeRequestAnimationFrame (line 541) | function fakeRequestAnimationFrame(callback) {

FILE: attachment_preview/static/lib/ViewerJS/pdf.js
  function info (line 226) | function info(msg) {
  function warn (line 233) | function warn(msg) {
  function error (line 241) | function error(msg) {
  function backtrace (line 250) | function backtrace() {
  function assert (line 258) | function assert(cond, msg) {
  function combineUrl (line 291) | function combineUrl(baseUrl, url) {
  function isValidUrl (line 321) | function isValidUrl(url, allowRelative) {
  function shadow (line 345) | function shadow(obj, prop, value) {
  function PasswordException (line 360) | function PasswordException(msg, code) {
  function UnknownErrorException (line 374) | function UnknownErrorException(msg, details) {
  function InvalidPDFException (line 388) | function InvalidPDFException(msg) {
  function MissingPDFException (line 401) | function MissingPDFException(msg) {
  function UnexpectedResponseException (line 415) | function UnexpectedResponseException(msg, status) {
  function NotImplementedException (line 429) | function NotImplementedException(msg) {
  function MissingDataException (line 441) | function MissingDataException(begin, end) {
  function XRefParseException (line 455) | function XRefParseException(msg) {
  function bytesToString (line 467) | function bytesToString(bytes) {
  function stringToBytes (line 484) | function stringToBytes(str) {
  function string32 (line 494) | function string32(value) {
  function log2 (line 499) | function log2(x) {
  function readInt8 (line 508) | function readInt8(data, start) {
  function readUint16 (line 512) | function readUint16(data, offset) {
  function readUint32 (line 516) | function readUint32(data, offset) {
  function isLittleEndian (line 523) | function isLittleEndian() {
  function hasCanvasTypedArrays (line 539) | function hasCanvasTypedArrays() {
  function Uint32ArrayView (line 556) | function Uint32ArrayView(buffer, length) {
  function createUint32ArrayProp (line 565) | function createUint32ArrayProp(index) {
  function ensureUint32ArrayViewProps (line 582) | function ensureUint32ArrayViewProps(length) {
  function Util (line 600) | function Util() {}
  function compare (line 721) | function compare(a, b) {
  function PageViewport (line 827) | function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFl...
  function stringToPDFString (line 959) | function stringToPDFString(str) {
  function stringToUTF8String (line 976) | function stringToUTF8String(str) {
  function isEmptyObj (line 980) | function isEmptyObj(obj) {
  function isBool (line 987) | function isBool(v) {
  function isInt (line 991) | function isInt(v) {
  function isNum (line 995) | function isNum(v) {
  function isString (line 999) | function isString(v) {
  function isName (line 1003) | function isName(v) {
  function isCmd (line 1007) | function isCmd(v, cmd) {
  function isDict (line 1011) | function isDict(v, type) {
  function isArray (line 1022) | function isArray(v) {
  function isStream (line 1026) | function isStream(v) {
  function isArrayBuffer (line 1030) | function isArrayBuffer(v) {
  function isRef (line 1034) | function isRef(v) {
  function createPromiseCapability (line 1054) | function createPromiseCapability() {
  function Promise (line 1238) | function Promise(resolver) {
  function reject (line 1265) | function reject(reason) {
  function rpad (line 1386) | function rpad(str, pad, length) {
  function StatTimer (line 1392) | function StatTimer() {
  function MessageHandler (line 1481) | function MessageHandler(name, comObj) {
  function loadJpegStream (line 1602) | function loadJpegStream(id, imageUrl, objs) {
  function PDFDocumentLoadingTask (line 1903) | function PDFDocumentLoadingTask() {
  method promise (line 1926) | get promise() {
  function PDFDataRangeTransport (line 1958) | function PDFDataRangeTransport(length, initialData) {
  function PDFDocumentProxy (line 2030) | function PDFDocumentProxy(pdfInfo, transport) {
  method numPages (line 2038) | get numPages() {
  method fingerprint (line 2045) | get fingerprint() {
  function PDFPageProxy (line 2223) | function PDFPageProxy(pageIndex, pageInfo, transport) {
  method pageNumber (line 2239) | get pageNumber() {
  method rotate (line 2245) | get rotate() {
  method ref (line 2252) | get ref() {
  method view (line 2259) | get view() {
  function complete (line 2359) | function complete(error) {
  function operatorListChanged (line 2387) | function operatorListChanged() {
  function WorkerTransport (line 2506) | function WorkerTransport(workerInitializedCapability, pdfDataRangeTransp...
  function updatePassword (line 2628) | function updatePassword(password) {
  function PDFObjects (line 2980) | function PDFObjects() {
  function RenderTask (line 3083) | function RenderTask(internalRenderTask) {
  method promise (line 3100) | get promise() {
  function InternalRenderTask (line 3135) | function InternalRenderTask(callback, params, objs, commonObjs, operator...
  function fixMetadata (line 3247) | function fixMetadata(meta) {
  function Metadata (line 3264) | function Metadata(meta) {
  function createScratchCanvas (line 3344) | function createScratchCanvas(width, height) {
  function addContextCurrentTransform (line 3351) | function addContextCurrentTransform(ctx) {
  function compileType3Glyph (line 3502) | function compileType3Glyph(imgData) {
  function CanvasExtraState (line 3663) | function CanvasExtraState(old) {
  function CanvasGraphics (line 3716) | function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
  function putBinaryImageData (line 3745) | function putBinaryImageData(ctx, imgData) {
  function putBinaryImageMask (line 3866) | function putBinaryImageMask(ctx, imgData) {
  function copyCtxState (line 3900) | function copyCtxState(sourceCtx, destCtx) {
  function composeSMaskBackdrop (line 3919) | function composeSMaskBackdrop(bytes, r0, g0, b0) {
  function composeSMaskAlpha (line 3936) | function composeSMaskAlpha(maskData, layerData) {
  function composeSMaskLuminosity (line 3945) | function composeSMaskLuminosity(maskData, layerData) {
  function genericComposeSMask (line 3955) | function genericComposeSMask(maskCtx, layerCtx, width, height,
  function composeSMask (line 3986) | function composeSMask(ctx, smask, layerCtx) {
  method isFontSubpixelAAEnabled (line 4626) | get isFontSubpixelAAEnabled() {
  function loadShader (line 5457) | function loadShader(gl, code, shaderType) {
  function createVertexShader (line 5468) | function createVertexShader(gl, code) {
  function createFragmentShader (line 5471) | function createFragmentShader(gl, code) {
  function createProgram (line 5474) | function createProgram(gl, shaders) {
  function createTexture (line 5487) | function createTexture(gl, image, textureId) {
  function generateGL (line 5504) | function generateGL() {
  function initSmaskGL (line 5559) | function initSmaskGL() {
  function composeSMask (line 5605) | function composeSMask(layer, mask, properties) {
  function initFiguresGL (line 5691) | function initFiguresGL() {
  function drawFigures (line 5718) | function drawFigures(width, height, backgroundColor, figures, context) {
  function cleanup (line 5842) | function cleanup() {
  method isEnabled (line 5856) | get isEnabled() {
  function drawTriangle (line 5905) | function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
  function drawFigure (line 5969) | function drawFigure(data, figure, context) {
  function createMeshCanvas (line 6003) | function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
  function getShadingPatternFromIR (line 6129) | function getShadingPatternFromIR(raw) {
  function TilingPattern (line 6145) | function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {
  method loadTestFont (line 6309) | get loadTestFont() {
  function LoadLoader_completeRequest (line 6417) | function LoadLoader_completeRequest() {
  function int32 (line 6450) | function int32(data, offset) {
  function spliceString (line 6457) | function spliceString(s, offset, remove, insert) {
  function isFontReady (line 6471) | function isFontReady(name, callback) {
  function FontFaceObject (line 6562) | function FontFaceObject(name, file, properties) {
  function setTextStyles (line 6641) | function setTextStyles(element, item, fontObj) {
  function initContainer (line 6663) | function initContainer(item, drawBorder) {
  function getHtmlElementForTextWidgetAnnotation (line 6687) | function getHtmlElementForTextWidgetAnnotation(item, commonObjs) {
  function getHtmlElementForTextAnnotation (line 6711) | function getHtmlElementForTextAnnotation(item) {
  function getHtmlElementForLinkAnnotation (line 6830) | function getHtmlElementForLinkAnnotation(item) {
  function getHtmlElement (line 6845) | function getHtmlElement(data, objs) {
  function crc32 (line 6891) | function crc32(data, start, end) {
  function writePngChunk (line 6901) | function writePngChunk(type, body, data, offset) {
  function adler32 (line 6928) | function adler32(data, start, end) {
  function encode (line 6938) | function encode(imgData, kind) {
  function SVGExtraState (line 7065) | function SVGExtraState() {
  function createScratchSVG (line 7124) | function createScratchSVG(width, height) {
  function opListToTree (line 7134) | function opListToTree(opList) {
  function pf (line 7161) | function pf(value) {
  function pm (line 7184) | function pm(m) {
  function SVGGraphics (line 7205) | function SVGGraphics(commonObjs, objs) {

FILE: attachment_preview/static/lib/ViewerJS/pdf.worker.js
  function info (line 226) | function info(msg) {
  function warn (line 233) | function warn(msg) {
  function error (line 241) | function error(msg) {
  function backtrace (line 250) | function backtrace() {
  function assert (line 258) | function assert(cond, msg) {
  function combineUrl (line 291) | function combineUrl(baseUrl, url) {
  function isValidUrl (line 321) | function isValidUrl(url, allowRelative) {
  function shadow (line 345) | function shadow(obj, prop, value) {
  function PasswordException (line 360) | function PasswordException(msg, code) {
  function UnknownErrorException (line 374) | function UnknownErrorException(msg, details) {
  function InvalidPDFException (line 388) | function InvalidPDFException(msg) {
  function MissingPDFException (line 401) | function MissingPDFException(msg) {
  function UnexpectedResponseException (line 415) | function UnexpectedResponseException(msg, status) {
  function NotImplementedException (line 429) | function NotImplementedException(msg) {
  function MissingDataException (line 441) | function MissingDataException(begin, end) {
  function XRefParseException (line 455) | function XRefParseException(msg) {
  function bytesToString (line 467) | function bytesToString(bytes) {
  function stringToBytes (line 484) | function stringToBytes(str) {
  function string32 (line 494) | function string32(value) {
  function log2 (line 499) | function log2(x) {
  function readInt8 (line 508) | function readInt8(data, start) {
  function readUint16 (line 512) | function readUint16(data, offset) {
  function readUint32 (line 516) | function readUint32(data, offset) {
  function isLittleEndian (line 523) | function isLittleEndian() {
  function hasCanvasTypedArrays (line 539) | function hasCanvasTypedArrays() {
  function Uint32ArrayView (line 556) | function Uint32ArrayView(buffer, length) {
  function createUint32ArrayProp (line 565) | function createUint32ArrayProp(index) {
  function ensureUint32ArrayViewProps (line 582) | function ensureUint32ArrayViewProps(length) {
  function Util (line 600) | function Util() {}
  function compare (line 721) | function compare(a, b) {
  function PageViewport (line 827) | function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFl...
  function stringToPDFString (line 959) | function stringToPDFString(str) {
  function stringToUTF8String (line 976) | function stringToUTF8String(str) {
  function isEmptyObj (line 980) | function isEmptyObj(obj) {
  function isBool (line 987) | function isBool(v) {
  function isInt (line 991) | function isInt(v) {
  function isNum (line 995) | function isNum(v) {
  function isString (line 999) | function isString(v) {
  function isName (line 1003) | function isName(v) {
  function isCmd (line 1007) | function isCmd(v, cmd) {
  function isDict (line 1011) | function isDict(v, type) {
  function isArray (line 1022) | function isArray(v) {
  function isStream (line 1026) | function isStream(v) {
  function isArrayBuffer (line 1030) | function isArrayBuffer(v) {
  function isRef (line 1034) | function isRef(v) {
  function createPromiseCapability (line 1054) | function createPromiseCapability() {
  function Promise (line 1238) | function Promise(resolver) {
  function reject (line 1265) | function reject(reason) {
  function rpad (line 1386) | function rpad(str, pad, length) {
  function StatTimer (line 1392) | function StatTimer() {
  function MessageHandler (line 1481) | function MessageHandler(name, comObj) {
  function loadJpegStream (line 1602) | function loadJpegStream(id, imageUrl, objs) {
  function NetworkManager (line 1637) | function NetworkManager(url, args) {
  function getArrayBuffer (line 1657) | function getArrayBuffer(xhr) {
  function ChunkedStream (line 1872) | function ChunkedStream(length, chunkSize, manager) {
  method length (line 2002) | get length() {
  method isEmpty (line 2006) | get isEmpty() {
  function ChunkedStreamSubstream (line 2093) | function ChunkedStreamSubstream() {}
  function ChunkedStreamManager (line 2122) | function ChunkedStreamManager(length, chunkSize, url, args) {
  function BasePdfManager (line 2419) | function BasePdfManager() {
  function LocalPdfManager (line 2485) | function LocalPdfManager(data, password) {
  function NetworkPdfManager (line 2536) | function NetworkPdfManager(args, msgHandler) {
  function ensureHelper (line 2563) | function ensureHelper() {
  function Page (line 2623) | function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) {
  method content (line 2654) | get content() {
  method resources (line 2658) | get resources() {
  method mediaBox (line 2669) | get mediaBox() {
  method view (line 2678) | get view() {
  method annotationRefs (line 2696) | get annotationRefs() {
  method rotate (line 2701) | get rotate() {
  method annotations (line 2851) | get annotations() {
  function PDFDocument (line 2880) | function PDFDocument(pdfManager, arg, password) {
  function init (line 2890) | function init(pdfManager, stream, password) {
  function find (line 2898) | function find(stream, needle, limit, backwards) {
  method entries (line 2919) | get entries() {
  method linearization (line 2957) | get linearization() {
  method startXRef (line 2972) | get startXRef() {
  method mainXRefEntriesOffset (line 3014) | get mainXRefEntriesOffset() {
  method numPages (line 3054) | get numPages() {
  method documentInfo (line 3060) | get documentInfo() {
  method fingerprint (line 3090) | get fingerprint() {
  function Name (line 3129) | function Name(name) {
  function Cmd (line 3146) | function Cmd(cmd) {
  function isRecursionAllowedFor (line 3177) | function isRecursionAllowedFor(dict) {
  function Dict (line 3186) | function Dict(xref) {
  function Ref (line 3322) | function Ref(num, gen) {
  function RefSet (line 3345) | function RefSet() {
  function RefSetCache (line 3367) | function RefSetCache() {
  function Catalog (line 3403) | function Catalog(pdfManager, xref) {
  method metadata (line 3415) | get metadata() {
  method toplevelPagesDict (line 3447) | get toplevelPagesDict() {
  method documentOutline (line 3453) | get documentOutline() {
  method numPages (line 3521) | get numPages() {
  method destinations (line 3530) | get destinations() {
  function fetchDestination (line 3567) | function fetchDestination(dest) {
  method attachments (line 3598) | get attachments() {
  method javaScript (line 3622) | get javaScript() {
  function next (line 3708) | function next() {
  function pagesBeforeRef (line 3776) | function pagesBeforeRef(kidRef) {
  function next (line 3822) | function next(ref) {
  function XRef (line 3842) | function XRef(stream, password) {
  function readToken (line 4104) | function readToken(data, offset) {
  function skipUntil (line 4115) | function skipUntil(data, offset, what) {
  function NameTree (line 4463) | function NameTree(root, xref) {
  function FileSpec (line 4588) | function FileSpec(root, xref) {
  function pickPlatformItem (line 4610) | function pickPlatformItem(dict) {
  method filename (line 4629) | get filename() {
  method content (line 4639) | get content() {
  method serializable (line 4661) | get serializable() {
  function mayHaveChildren (line 4683) | function mayHaveChildren(value) {
  function addChildren (line 4687) | function addChildren(node, nodesToVisit) {
  function ObjectLoader (line 4712) | function ObjectLoader(obj, keys, xref) {
  function getTransformMatrix (line 4919) | function getTransformMatrix(rect, bbox, matrix) {
  function getDefaultAppearance (line 4944) | function getDefaultAppearance(dict) {
  function Annotation (line 4963) | function Annotation(params) {
  function reject (line 5197) | function reject(e) {
  function WidgetAnnotation (line 5229) | function WidgetAnnotation(params) {
  function TextWidgetAnnotation (line 5293) | function TextWidgetAnnotation(params) {
  function InteractiveAnnotation (line 5328) | function InteractiveAnnotation(params) {
  function TextAnnotation (line 5340) | function TextAnnotation(params) {
  function LinkAnnotation (line 5371) | function LinkAnnotation(params) {
  function addDefaultProtocolToUrl (line 5425) | function addDefaultProtocolToUrl(url) {
  function toMultiArray (line 5535) | function toMultiArray(arr) {
  function interpolate (line 5594) | function interpolate(x, xmin, xmax, ymin, ymax) {
  function isPDFFunction (line 5882) | function isPDFFunction(v) {
  function PostScriptStack (line 5898) | function PostScriptStack(initialStack) {
  function PostScriptEvaluator (line 5947) | function PostScriptEvaluator(operators) {
  function AstNode (line 6190) | function AstNode(type) {
  function AstArgument (line 6197) | function AstArgument(index, min, max) {
  function AstLiteral (line 6208) | function AstLiteral(number) {
  function AstBinaryOperation (line 6219) | function AstBinaryOperation(op, arg1, arg2, min, max) {
  function AstMin (line 6232) | function AstMin(arg, max) {
  function AstVariable (line 6243) | function AstVariable(index, min, max) {
  function AstVariableDefinition (line 6254) | function AstVariableDefinition(variable, arg) {
  function ExpressionBuilderVisitor (line 6264) | function ExpressionBuilderVisitor() {
  function buildAddOperation (line 6302) | function buildAddOperation(num1, num2) {
  function buildMulOperation (line 6319) | function buildMulOperation(num1, num2) {
  function buildSubOperation (line 6346) | function buildSubOperation(num1, num2) {
  function buildMinOperation (line 6366) | function buildMinOperation(num1, max) {
  function PostScriptCompiler (line 6377) | function PostScriptCompiler() {}
  function ColorSpace (line 6553) | function ColorSpace() {
  method gray (line 6889) | get gray() {
  method rgb (line 6892) | get rgb() {
  method cmyk (line 6895) | get cmyk() {
  function AlternateCS (line 6910) | function AlternateCS(numComps, base, tintFn) {
  function PatternCS (line 6989) | function PatternCS(baseCS) {
  function IndexedCS (line 6999) | function IndexedCS(base, highVal, lookup) {
  function DeviceGrayCS (line 7065) | function DeviceGrayCS() {
  function DeviceRgbCS (line 7107) | function DeviceRgbCS() {
  function convertToRgb (line 7162) | function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
  function DeviceCmykCS (line 7200) | function DeviceCmykCS() {
  function CalGrayCS (line 7240) | function CalGrayCS(whitePoint, blackPoint, gamma) {
  function convertToRgb (line 7285) | function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
  function CalRGBCS (line 7363) | function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {
  function matrixProduct (line 7431) | function matrixProduct(a, b, result) {
  function convertToFlat (line 7437) | function convertToFlat(sourceWhitePoint, LMS, result) {
  function convertToD65 (line 7443) | function convertToD65(sourceWhitePoint, LMS, result) {
  function sRGBTransferFunction (line 7453) | function sRGBTransferFunction(color) {
  function adjustToRange (line 7462) | function adjustToRange(min, max, value) {
  function decodeL (line 7466) | function decodeL(L) {
  function compensateBlackPoint (line 7478) | function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
  function normalizeWhitePointToFlat (line 7520) | function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
  function normalizeWhitePointToD65 (line 7540) | function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
  function convertToRgb (line 7551) | function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
  function LabCS (line 7639) | function LabCS(whitePoint, blackPoint, range) {
  function fn_g (line 7685) | function fn_g(x) {
  function decode (line 7693) | function decode(value, high1, low2, high2) {
  function convertToRgb (line 7698) | function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
  function ARCFourCipher (line 7779) | function ARCFourCipher(key) {
  function hash (line 7840) | function hash(data, offset, length) {
  function Word64 (line 7905) | function Word64(highInteger, lowInteger) {
  function rotr (line 7993) | function rotr(x, n) {
  function ch (line 7997) | function ch(x, y, z) {
  function maj (line 8001) | function maj(x, y, z) {
  function sigma (line 8005) | function sigma(x) {
  function sigmaPrime (line 8009) | function sigmaPrime(x) {
  function littleSigma (line 8013) | function littleSigma(x) {
  function littleSigmaPrime (line 8017) | function littleSigmaPrime(x) {
  function hash (line 8038) | function hash(data, offset, length) {
  function ch (line 8115) | function ch(result, x, y, z, tmp) {
  function maj (line 8124) | function maj(result, x, y, z, tmp) {
  function sigma (line 8135) | function sigma(result, x, tmp) {
  function sigmaPrime (line 8146) | function sigmaPrime(result, x, tmp) {
  function littleSigma (line 8157) | function littleSigma(result, x, tmp) {
  function littleSigmaPrime (line 8168) | function littleSigmaPrime(result, x, tmp) {
  function hash (line 8221) | function hash(data, offset, length, mode384) {
  function hash (line 8370) | function hash(data, offset, length) {
  function NullCipher (line 8377) | function NullCipher() {
  function expandKey128 (line 8514) | function expandKey128(cipherKey) {
  function decrypt128 (line 8542) | function decrypt128(input, key) {
  function encrypt128 (line 8619) | function encrypt128(input, key) {
  function AES128Cipher (line 8698) | function AES128Cipher(key) {
  function decryptBlock2 (line 8704) | function decryptBlock2(data, finalize) {
  function expandKey256 (line 8947) | function expandKey256(cipherKey) {
  function decrypt256 (line 8988) | function decrypt256(input, key) {
  function encrypt256 (line 9065) | function encrypt256(input, key) {
  function AES256Cipher (line 9146) | function AES256Cipher(key) {
  function decryptBlock2 (line 9152) | function decryptBlock2(data, finalize) {
  function compareByteArrays (line 9280) | function compareByteArrays(array1, array2) {
  function PDF17 (line 9292) | function PDF17() {
  function concatArrays (line 9347) | function concatArrays(array1, array2) {
  function calculatePDF20Hash (line 9354) | function calculatePDF20Hash(password, input, userBytes) {
  function PDF20 (line 9399) | function PDF20() {
  function compareByteArrays (line 9402) | function compareByteArrays(array1, array2) {
  function CipherTransform (line 9468) | function CipherTransform(stringCipherConstructor, streamCipherConstructo...
  function createEncryptionKey20 (line 9499) | function createEncryptionKey20(revision, password, ownerPassword,
  function prepareKeyData (line 9531) | function prepareKeyData(fileId, password, ownerPassword, userPassword,
  function decodeUserPassword (line 9607) | function decodeUserPassword(password, ownerPassword, revision, keyLength) {
  function CipherTransformFactory (line 9645) | function CipherTransformFactory(dict, fileId, password) {
  function buildObjectKey (line 9730) | function buildObjectKey(num, gen, encryptionKey, isAes) {
  function buildCipherConstructor (line 9750) | function buildCipherConstructor(cf, name, num, gen, key) {
  function Pattern (line 9814) | function Pattern() {
  function RadialAxial (line 9869) | function RadialAxial(dict, matrix, xref, res) {
  function MeshStreamReader (line 9999) | function MeshStreamReader(stream, context) {
  method hasData (line 10012) | get hasData() {
  function decodeType4Shading (line 10093) | function decodeType4Shading(mesh, reader) {
  function decodeType5Shading (line 10137) | function decodeType5Shading(mesh, reader, verticesPerRow) {
  function buildB (line 10165) | function buildB(count) {
  function buildFigureFromPatch (line 10183) | function buildFigureFromPatch(mesh, index) {
  function decodeType6Shading (line 10266) | function decodeType6Shading(mesh, reader) {
  function decodeType7Shading (line 10374) | function decodeType7Shading(mesh, reader) {
  function updateBounds (line 10436) | function updateBounds(mesh) {
  function packData (line 10449) | function packData(mesh) {
  function Mesh (line 10481) | function Mesh(stream, matrix, xref, res) {
  function Dummy (line 10559) | function Dummy() {
  function getTilingPatternIR (line 10571) | function getTilingPatternIR(operatorList, dict, args) {
  function PartialEvaluator (line 10587) | function PartialEvaluator(pdfManager, xref, handler, pageIndex,
  function TimeSlotManager (line 10601) | function TimeSlotManager() {
  function errorFont (line 11009) | function errorFont() {
  function newTextChunk (line 11468) | function newTextChunk() {
  function runBidi (line 11490) | function runBidi(textChunk) {
  function handleSetFont (line 11498) | function handleSetFont(fontName, fontRef) {
  function buildTextGeometry (line 11507) | function buildTextGeometry(chars, textChunk) {
  function TranslatedFont (line 12327) | function TranslatedFont(loadedName, font, dict) {
  function getTransfers (line 12391) | function getTransfers(queue) {
  function OperatorList (line 12409) | function OperatorList(intent, messageHandler, pageIndex) {
  method length (line 12419) | get length() {
  function StateManager (line 12491) | function StateManager(initialState) {
  function TextState (line 12515) | function TextState() {
  function EvalState (line 12571) | function EvalState() {
  function EvaluatorPreprocessor (line 12700) | function EvaluatorPreprocessor(stream, xref, stateManager) {
  method savedStatesDepth (line 12709) | get savedStatesDepth() {
  function addState (line 12823) | function addState(parentState, pattern, fn) {
  function handlePaintSolidColorImageMask (line 12832) | function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
  function QueueOptimizer (line 13195) | function QueueOptimizer() {}
  function CMap (line 13401) | function CMap(builtInCMap) {
  method isIdentityCMap (line 13514) | get isIdentityCMap() {
  function IdentityCMap (line 13535) | function IdentityCMap(vertical, n) {
  method isIdentityCMap (line 13590) | get isIdentityCMap() {
  function fetchBinaryData (line 13599) | function fetchBinaryData(url) {
  function hexToInt (line 13627) | function hexToInt(a, size) {
  function hexToStr (line 13635) | function hexToStr(a, size) {
  function addHex (line 13647) | function addHex(a, b, size) {
  function incHex (line 13656) | function incHex(a, size) {
  function BinaryCMapStream (line 13668) | function BinaryCMapStream(data) {
  function processBinaryCMap (line 13746) | function processBinaryCMap(url, cMap, extend) {
  function BinaryCMapReader (line 13906) | function BinaryCMapReader() {}
  function strToInt (line 13916) | function strToInt(str) {
  function expectString (line 13924) | function expectString(obj) {
  function expectInt (line 13930) | function expectInt(obj) {
  function parseBfChar (line 13936) | function parseBfChar(cMap, lexer) {
  function parseBfRange (line 13955) | function parseBfRange(cMap, lexer) {
  function parseCidChar (line 13988) | function parseCidChar(cMap, lexer) {
  function parseCidRange (line 14006) | function parseCidRange(cMap, lexer) {
  function parseCodespaceRange (line 14027) | function parseCodespaceRange(cMap, lexer) {
  function parseWMode (line 14050) | function parseWMode(cMap, lexer) {
  function parseCMapName (line 14057) | function parseCMapName(cMap, lexer) {
  function parseCMap (line 14064) | function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {
  function extendCMap (line 14116) | function extendCMap(cMap, builtInCMapParams, useCMap) {
  function parseBinaryCMap (line 14136) | function parseBinaryCMap(name, builtInCMapParams) {
  function createBuiltInCMap (line 14145) | function createBuiltInCMap(name, builtInCMapParams) {
  function mapSpecialUnicodeValues (line 14711) | function mapSpecialUnicodeValues(code) {
  function getUnicodeRangeFor (line 14884) | function getUnicodeRangeFor(value) {
  function isRTLRangeFor (line 14894) | function isRTLRangeFor(value) {
  function reverseIfRtl (line 16288) | function reverseIfRtl(chars) {
  function adjustWidths (line 16301) | function adjustWidths(properties) {
  function getFontType (line 16314) | function getFontType(type, subtype) {
  function Glyph (line 16337) | function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) {
  function ToUnicodeMap (line 16360) | function ToUnicodeMap(cmap) {
  method length (line 16367) | get length() {
  function IdentityToUnicodeMap (line 16394) | function IdentityToUnicodeMap(firstChar, lastChar) {
  method length (line 16400) | get length() {
  function writeInt16 (line 16430) | function writeInt16(dest, offset, num) {
  function writeInt32 (line 16435) | function writeInt32(dest, offset, num) {
  function writeData (line 16442) | function writeData(dest, offset, data) {
  function OpenTypeFileBuilder (line 16458) | function OpenTypeFileBuilder(sfnt) {
  function Font (line 16579) | function Font(name, file, properties) {
  function int16 (line 16810) | function int16(b0, b1) {
  function int32 (line 16814) | function int32(b0, b1, b2, b3) {
  function string16 (line 16818) | function string16(value) {
  function safeString16 (line 16822) | function safeString16(value) {
  function isTrueTypeFile (line 16828) | function isTrueTypeFile(file) {
  function isType1File (line 16833) | function isType1File(file) {
  function isProblematicUnicodeLocation (line 16851) | function isProblematicUnicodeLocation(code) {
  function adjustMapping (line 16889) | function adjustMapping(charCodeToGlyphId, properties) {
  function getRanges (line 16945) | function getRanges(glyphs) {
  function createCmapTable (line 16978) | function createCmapTable(glyphs) {
  function validateOS2Table (line 17095) | function validateOS2Table(os2) {
  function createOS2Table (line 17121) | function createOS2Table(properties, charstrings, override) {
  function createPostTable (line 17228) | function createPostTable(properties) {
  function createNameTable (line 17241) | function createNameTable(name, proto) {
  method renderer (line 17311) | get renderer() {
  function readTableEntry (line 17327) | function readTableEntry(file) {
  function readOpenTypeHeader (line 17356) | function readOpenTypeHeader(ttf) {
  function readCmapTable (line 17370) | function readCmapTable(cmap, font, isSymbolicFont) {
  function sanitizeMetrics (line 17558) | function sanitizeMetrics(font, header, metrics, numGlyphs) {
  function sanitizeGlyph (line 17593) | function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,
  function sanitizeHead (line 17666) | function sanitizeHead(head, numGlyphs, locaLength) {
  function sanitizeGlyphLocations (line 17710) | function sanitizeGlyphLocations(loca, glyf, numGlyphs,
  function readPostScriptTable (line 17808) | function readPostScriptTable(post, properties, maxpNumGlyphs) {
  function readNameTable (line 17874) | function readNameTable(nameTable) {
  function sanitizeTTProgram (line 17942) | function sanitizeTTProgram(table, ttContext) {
  function checkInvalidFunctions (line 18101) | function checkInvalidFunctions(ttContext, maxFunctionDefs) {
  function foldTTTable (line 18124) | function foldTTTable(table, content) {
  function sanitizeTTPrograms (line 18144) | function sanitizeTTPrograms(fpgm, prep, cvt) {
  function hasGlyph (line 18296) | function hasGlyph(glyphId, charCode) {
  function getCharCodes (line 18503) | function getCharCodes(charCodeToGlyphId, glyphId) {
  function createCharCode (line 18516) | function createCharCode(charCodeToGlyphId, glyphId) {
  method spaceWidth (line 18779) | get spaceWidth() {
  function ErrorFont (line 18932) | function ErrorFont(error) {
  function type1FontGlyphMapping (line 18959) | function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
  function Type1CharString (line 19068) | function Type1CharString() {
  function isHexDigit (line 19353) | function isHexDigit(code) {
  function decrypt (line 19359) | function decrypt(data, key, discardNumber) {
  function decryptAscii (line 19371) | function decryptAscii(data, key, discardNumber) {
  function isSpecial (line 19395) | function isSpecial(c) {
  function Type1Parser (line 19402) | function Type1Parser(stream, encrypted) {
  method numGlyphs (line 19798) | get numGlyphs() {
  function CFFFont (line 19980) | function CFFFont(file, properties) {
  method numGlyphs (line 19998) | get numGlyphs() {
  function CFFParser (line 20136) | function CFFParser(file, properties) {
  function parseOperand (line 20241) | function parseOperand() {
  function parseFloatOperand (line 20267) | function parseFloatOperand() {
  function readSupplement (line 20620) | function readSupplement() {
  function CFF (line 20723) | function CFF() {
  function CFFHeader (line 20744) | function CFFHeader(major, minor, hdrSize, offSize) {
  function CFFStrings (line 20754) | function CFFStrings() {
  method count (line 20770) | get count() {
  function CFFIndex (line 20778) | function CFFIndex() {
  method count (line 20794) | get count() {
  function CFFDict (line 20802) | function CFFDict(tables, strings) {
  function CFFTopDict (line 20918) | function CFFTopDict(strings) {
  function CFFPrivateDict (line 20951) | function CFFPrivateDict(strings) {
  function CFFCharset (line 20968) | function CFFCharset(predefined, format, charset, raw) {
  function CFFEncoding (line 20978) | function CFFEncoding(predefined, format, encoding, raw) {
  function CFFFDSelect (line 20988) | function CFFFDSelect(fdSelect, raw) {
  function CFFOffsetTracker (line 20998) | function CFFOffsetTracker() {
  function CFFCompiler (line 21050) | function CFFCompiler(cff) {
  function getLong (line 21474) | function getLong(data, offset) {
  function getUshort (line 21479) | function getUshort(data, offset) {
  function parseCmap (line 21483) | function parseCmap(data, start, end) {
  function parseCff (line 21533) | function parseCff(data, start, end) {
  function parseGlyfTable (line 21546) | function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
  function lookupCmap (line 21570) | function lookupCmap(ranges, unicode) {
  function compileGlyf (line 21588) | function compileGlyf(code, js, font) {
  function compileCharString (line 21743) | function compileCharString(code, js, font) {
  function CompiledFont (line 22044) | function CompiledFont(fontMatrix) {
  function TrueTypeCompiled (line 22085) | function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
  function Type2Compiled (line 22101) | function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
  function handleImageData (line 26585) | function handleImageData(handler, xref, res, image) {
  function decodeAndClamp (line 26607) | function decodeAndClamp(value, addend, coefficient, max) {
  function PDFImage (line 26613) | function PDFImage(xref, res, image, inline, smask, mask, isMask) {
  method drawWidth (line 26851) | get drawWidth() {
  method drawHeight (line 26857) | get drawHeight() {
  function isEOF (line 30174) | function isEOF(v) {
  function Parser (line 30181) | function Parser(lexer, allowStreams, xref) {
  function Lexer (line 30736) | function Lexer(stream, knownCommands) {
  function toHexDigit (line 30783) | function toHexDigit(ch) {
  function getInt (line 31150) | function getInt(name, allowZeroValue) {
  function getHints (line 31158) | function getHints() {
  function PostScriptParser (line 31199) | function PostScriptParser(lexer) {
  function PostScriptToken (line 31288) | function PostScriptToken(type, value) {
  function PostScriptLexer (line 31314) | function PostScriptLexer(stream) {
  function Stream (line 31403) | function Stream(arrayBuffer, start, length, dict) {
  method length (line 31415) | get length() {
  method isEmpty (line 31418) | get isEmpty() {
  function StringStream (line 31491) | function StringStream(str) {
  function DecodeStream (line 31513) | function DecodeStream(maybeMinBufferLength) {
  method isEmpty (line 31528) | get isEmpty() {
  function StreamsSequenceStream (line 31634) | function StreamsSequenceStream(streams) {
  function FlateStream (line 31767) | function FlateStream(str, maybeLength) {
  function PredictorStream (line 32038) | function PredictorStream(str, maybeLength, params) {
  function JpegStream (line 32245) | function JpegStream(stream, maybeLength, dict, xref) {
  function JpxStream (line 32345) | function JpxStream(stream, maybeLength, dict) {
  function Jbig2Stream (line 32414) | function Jbig2Stream(stream, maybeLength, dict) {
  function DecryptStream (line 32474) | function DecryptStream(str, maybeLength, decrypt) {
  function Ascii85Stream (line 32519) | function Ascii85Stream(str, maybeLength) {
  function AsciiHexStream (line 32602) | function AsciiHexStream(str, maybeLength) {
  function RunLengthStream (line 32664) | function RunLengthStream(str, maybeLength) {
  function CCITTFaxStream (line 33138) | function CCITTFaxStream(str, maybeLength, params) {
  function LZWStream (line 33709) | function LZWStream(str, maybeLength, earlyChange) {
  function NullStream (line 33840) | function NullStream() {
  function loadDocument (line 33854) | function loadDocument(recoveryMode) {
  function getPdfManager (line 33887) | function getPdfManager(data) {
  function ArithmeticDecoder (line 34388) | function ArithmeticDecoder(data, start, end) {
  function constructor (line 34523) | function constructor() {
  function buildHuffmanTable (line 34526) | function buildHuffmanTable(codeLengths, values) {
  function getBlockBufferOffset (line 34559) | function getBlockBufferOffset(component, row, col) {
  function decodeScan (line 34563) | function decodeScan(data, offset, frame, components, resetInterval,
  function quantizeAndInverse (line 34841) | function quantizeAndInverse(component, blockBufferOffset, p) {
  function buildComponentData (line 35022) | function buildComponentData(frame, component) {
  function clamp0to255 (line 35036) | function clamp0to255(a) {
  function readUint16 (line 35043) | function readUint16() {
  function readDataBlock (line 35049) | function readDataBlock() {
  function prepareComponents (line 35056) | function prepareComponents(frame) {
  function JpxImage (line 35509) | function JpxImage() {
  function calculateComponentDimensions (line 35887) | function calculateComponentDimensions(component, siz) {
  function calculateTileGrids (line 35896) | function calculateTileGrids(context, components) {
  function getBlocksDimensions (line 35933) | function getBlocksDimensions(context, component, r) {
  function buildPrecincts (line 35950) | function buildPrecincts(context, resolution, dimensions) {
  function buildCodeblocks (line 35989) | function buildCodeblocks(context, subband, dimensions) {
  function createPacket (line 36070) | function createPacket(resolution, precinctNumber, layerNumber) {
  function LayerResolutionComponentPositionIterator (line 36091) | function LayerResolutionComponentPositionIterator(context) {
  function ResolutionLayerComponentPositionIterator (line 36131) | function ResolutionLayerComponentPositionIterator(context) {
  function ResolutionPositionComponentLayerIterator (line 36171) | function ResolutionPositionComponentLayerIterator(context) {
  function PositionComponentResolutionLayerIterator (line 36230) | function PositionComponentResolutionLayerIterator(context) {
  function ComponentPositionResolutionLayerIterator (line 36277) | function ComponentPositionResolutionLayerIterator(context) {
  function getPrecinctIndexIfExist (line 36323) | function getPrecinctIndexIfExist(
  function getPrecinctSizesInImageScale (line 36336) | function getPrecinctSizesInImageScale(tile) {
  function buildPackets (line 36395) | function buildPackets(context) {
  function parseTilePackets (line 36504) | function parseTilePackets(context, data, offset, dataLength) {
  function copyCoefficients (line 36679) | function copyCoefficients(coefficients, levelWidth, levelHeight, subband,
  function transformTile (line 36777) | function transformTile(context, tile, c) {
  function transformComponents (line 36848) | function transformComponents(context) {
  function initializeTile (line 36944) | function initializeTile(context, tileIndex) {
  function TagTree (line 36962) | function TagTree(width, height) {
  function InclusionTree (line 37021) | function InclusionTree(width, height,  defaultValue) {
  function BitModel (line 37124) | function BitModel(width, height, subband, zeroBitPlanes, mb) {
  function Transform (line 37448) | function Transform() {}
  function IrreversibleTransform (line 37576) | function IrreversibleTransform() {
  function ReversibleTransform (line 37670) | function ReversibleTransform() {
  function ContextCache (line 37699) | function ContextCache() {}
  function DecodingContext (line 37710) | function DecodingContext(data, start, end) {
  method decoder (line 37717) | get decoder() {
  method contextCache (line 37721) | get contextCache() {
  function decodeInteger (line 37729) | function decodeInteger(contextCache, procedure, decoder) {
  function decodeIAID (line 37760) | function decodeIAID(contextCache, decoder, codeLength) {
  function decodeBitmapTemplate0 (line 37831) | function decodeBitmapTemplate0(width, height, decodingContext) {
  function decodeBitmap (line 37867) | function decodeBitmap(mmr, width, height, templateIndex, prediction, ski...
  function decodeRefinement (line 37995) | function decodeRefinement(width, height, templateIndex, referenceBitmap,
  function decodeSymbolDictionary (line 38073) | function decodeSymbolDictionary(huffman, refinement, symbols,
  function decodeTextRegion (line 38160) | function decodeTextRegion(huffman, refinement, width, height,
  function readSegmentHeader (line 38285) | function readSegmentHeader(data, start) {
  function readSegments (line 38375) | function readSegments(header, data, start, end) {
  function readRegionSegmentInformation (line 38406) | function readRegionSegmentInformation(data, start) {
  function processSegment (line 38417) | function processSegment(segment, visitor) {
  function processSegments (line 38578) | function processSegments(segments, visitor) {
  function parseJbig2 (line 38584) | function parseJbig2(data, start, end) {
  function parseJbig2Chunks (line 38605) | function parseJbig2Chunks(chunks) {
  function SimpleSegmentVisitor (line 38615) | function SimpleSegmentVisitor() {}
  function Jbig2Image (line 38754) | function Jbig2Image() {}
  function isOdd (line 38816) | function isOdd(i) {
  function isEven (line 38820) | function isEven(i) {
  function findUnequal (line 38824) | function findUnequal(arr, start, value) {
  function setValues (line 38833) | function setValues(arr, start, end, value) {
  function reverseValues (line 38839) | function reverseValues(arr, start, end) {
  function createBidiText (line 38847) | function createBidiText(str, isLTR, vertical) {
  function bidi (line 38859) | function bidi(str, startLevel, vertical) {
  function MurmurHash3_64 (line 39203) | function MurmurHash3_64 (seed) {

FILE: attachment_preview/static/lib/ViewerJS/text_layer_builder.js
  function isAllWhitespace (line 24) | function isAllWhitespace(str) {
  function TextLayerBuilder (line 44) | function TextLayerBuilder(options) {
  function beginText (line 290) | function beginText(begin, className) {
  function appendTextToDiv (line 296) | function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
  function DefaultTextLayerFactory (line 404) | function DefaultTextLayerFactory() {}

FILE: attachment_preview/static/lib/ViewerJS/ui_utils.js
  function CustomStyle (line 36) | function CustomStyle() {}
  function getFileName (line 77) | function getFileName(url) {
  function getOutputScale (line 92) | function getOutputScale(ctx) {
  function scrollIntoView (line 113) | function scrollIntoView(element, spot) {
  function watchScroll (line 152) | function watchScroll(viewAreaElement, callback) {
  function binarySearchFirstItem (line 191) | function binarySearchFirstItem(items, condition) {
  function getVisibleElements (line 217) | function getVisibleElements(scrollEl, views, sortByVisibility) {
  function noContextMenuHandler (line 280) | function noContextMenuHandler(e) {
  function getPDFFileNameFromURL (line 289) | function getPDFFileNameFromURL(url) {
  function clamp (line 316) | function clamp(v, min, max) {
  function ProgressBar (line 320) | function ProgressBar(id, opts) {
  method percent (line 353) | get percent() {
  method percent (line 357) | set percent(val) {

FILE: attachment_preview/static/lib/ViewerJS/webodf.js
  function Runtime (line 43) | function Runtime(){}
  function c (line 46) | function c(b){var c="",r,q=b.length;for(r=0;r<q;r+=1)c+=String.fromCharC...
  function b (line 46) | function b(b){var c="",r,q=b.length,e=[],l,a,d,m;for(r=3<=q&&239===b[0]&...
  function BrowserRuntime (line 49) | function BrowserRuntime(){function g(b){var e=b.length,l,a,d=0;for(l=0;l...
  function NodeJSRuntime (line 59) | function NodeJSRuntime(){function g(b){var e=b.length,l,a=new Uint8Array...
  function RhinoRuntime (line 64) | function RhinoRuntime(){var g=this,k={},c=k.javax.xml.parsers.DocumentBu...
  function g (line 70) | function g(b,c,e){var l=b+"/manifest.json",a,d;runtime.log("Loading mani...
  function k (line 70) | function k(b,c,e){function l(h){if(!m[h]&&!e(h)){if(d[h])throw"Circular ...
  function c (line 71) | function c(b,c){return c+("\n//# sourceURL="+b)}
  function b (line 71) | function b(b){var f,e;for(f=0;f<b.length;f+=1)e=runtime.readFileSync(b[f...
  function f (line 71) | function f(b){b=b.split(".");var c,e=p,l=b.length;for(c=0;c<l;c+=1){if(!...
  function k (line 74) | function k(c){if(c.length){var b=c[0];runtime.readFile(b,"utf8",function...
  function b (line 75) | function b(b){p!==n&&(b?(p=n,c(b)):(p+=1,p===n&&c(null)))}
  function c (line 75) | function c(b,f){if(f)k(f);else if(b<g.length)g[b](function(f){c(b+1,f)})...
  function makeBase64 (line 76) | function makeBase64(){function g(a){var d,m=a.length,h=new Uint8Array(ne...
  function g (line 85) | function g(){var b,f,n,g,k,q,e,l,a;void 0===c&&(f=(b=runtime.getWindow()...
  function k (line 87) | function k(b,c,n){for(b=b?b.firstElementChild:null;b;){if(b.localName===...
  function b (line 87) | function b(a,d){for(var b=0,c;a.parentNode!==d;)runtime.assert(null!==a....
  function c (line 88) | function c(a,d){return 0>=a.compareBoundaryPoints(Range.START_TO_START,d...
  function n (line 88) | function n(a,d){return 0>=a.compareBoundaryPoints(Range.END_TO_START,d)&...
  function p (line 88) | function p(a,d){var b=null;a.nodeType===Node.TEXT_NODE&&(0===a.length?(a...
  function r (line 89) | function r(a){for(var d=a.parentNode;a.firstChild;)d.insertBefore(a.firs...
  function q (line 89) | function q(a,d){var b=a.parentNode,c=a.firstChild,l=d(a),e;if(l===NodeFi...
  function e (line 89) | function e(a,d){return a===d||Boolean(a.compareDocumentPosition(d)&Node....
  function l (line 89) | function l(a,d){return g().unscaledRangeClientRects?a:a/d}
  function a (line 89) | function a(d,h,b){Object.keys(h).forEach(function(c){var l=
  function c (line 102) | function c(a){a.parentNode&&(r.push(a.previousSibling),r.push(a.nextSibl...
  function b (line 102) | function b(a,d,b){if(d.nodeType===Node.TEXT_NODE){runtime.assert(Boolean...
  function k (line 106) | function k(b){runtime.assert(!c.hasOwnProperty(b),'Duplicated event ids:...
  function b (line 108) | function b(){p&&(c(n),p=!1)}
  function f (line 108) | function f(){b();g.apply(void 0,r);r=null}
  function g (line 112) | function g(b,f,n){b.subscribe(f,n);c.push({eventSource:b,eventid:f,callb...
  function k (line 112) | function k(){var n=[];c.forEach(function(b){b.eventSource.unsubscribe(b....
  function f (line 115) | function f(){this.acceptNode=function(a){return!a||a.nodeType===m&&0===a...
  function n (line 115) | function n(a){this.acceptNode=function(d){return!d||d.nodeType===m&&0===...
  function p (line 115) | function p(){var d=l.currentNode,b=d.nodeType;a=b===m?d.length-1:b===h?1:0}
  function r (line 115) | function r(){if(null===l.previousSibling()){if(!l.parentNode()||l.curren...
  function q (line 115) | function q(){var b=l.currentNode,c;c=d(b);if(b!==g)for(b=b.parentNode;b&&
  function c (line 123) | function c(){a=null;m=d=void 0}
  function b (line 123) | function b(){void 0===m&&(m=g.acceptPosition(k)===e);return m}
  function f (line 123) | function f(a,d){c();return k.setUnfilteredPosition(a,d)}
  function n (line 123) | function n(){a||(a=k.container());return a}
  function p (line 123) | function p(){void 0===d&&(d=k.unfilteredDomOffset());return d}
  function r (line 123) | function r(){for(c();k.nextPosition();)if(c(),b())return!0;return!1}
  function q (line 123) | function q(){for(c();k.previousPosition();)if(c(),b())return!0;return!1}
  function g (line 126) | function g(k,c){if(c&&Array.isArray(c)){k=k||[];if(!Array.isArray(k))thr...
  function c (line 128) | function c(b,c){var a=r.file(b);a?c(null,a.asUint8Array()):c(b+" not fou...
  function b (line 128) | function b(b,l){c(b,function(a,d){if(a||null===d)return l(a,null);var b=...
  function f (line 128) | function f(b,c){try{b(r.generate({type:"uint8array",compression:"DEFLATE...
  function n (line 128) | function n(b,c){f(function(a){runtime.writeFile(b,a,c)},c)}
  function g (line 132) | function g(b){k.hasOwnProperty(b)||(k[b]=!1,c.register(b))}
  function g (line 148) | function g(a){return"image"===(a&&a.localName)&&a.namespaceURI===R}
  function k (line 148) | function k(a){return null!==a&&a.nodeType===Node.ELEMENT_NODE&&"frame"==...
  function c (line 148) | function c(a){var d;(d="annotation"===(a&&a.localName)&&a.namespaceURI==...
  function b (line 148) | function b(a){return"a"===(a&&a.localName)&&a.namespaceURI===J}
  function f (line 148) | function f(a){var d=
  function n (line 149) | function n(a,d){for(a&&void 0!==d&&!f(a)&&a.childNodes.item(d)&&(a=a.chi...
  function p (line 149) | function p(a,d){for(;a&&a!==d;){if(a.namespaceURI===odf.Namespaces.offic...
  function r (line 149) | function r(a){return/^[ \t\r\n]+$/.test(a)}
  function q (line 149) | function q(a){if(null===a||a.nodeType!==Node.ELEMENT_NODE)return!1;var d...
  function e (line 150) | function e(a){return null===a||a.nodeType!==Node.ELEMENT_NODE?!1:fa.isFi...
  function l (line 150) | function l(a){var d=a&&a.localName,b=!1;d&&(a=a.namespaceURI,a===J&&(b="...
  function a (line 150) | function a(a){return l(a)||e(a)||k(a)||c(a)}
  function d (line 150) | function d(a){var d=a&&a.localName,b=!1;d&&(a=a.namespaceURI,a===J&&(b="...
  function m (line 150) | function m(a){return-1!==S.indexOf(a.namespaceURI)}
  function h (line 150) | function h(a){if(l(a)||e(a))return!1;if(q(a.parentNode)&&
  function y (line 151) | function y(a){for(;null!==a.firstChild&&q(a);)a=a.firstChild;return a}
  function x (line 151) | function x(a){for(;null!==a.lastChild&&q(a);)a=a.lastChild;return a}
  function z (line 151) | function z(a){for(;!f(a)&&null===a.previousSibling;)a=a.parentNode;retur...
  function w (line 151) | function w(a){for(;!f(a)&&null===a.nextSibling;)a=a.parentNode;return f(...
  function v (line 151) | function v(b){for(var c=!1;b;)if(b.nodeType===
  function u (line 152) | function u(d){var b=!1,c;for(d=d&&y(d);d;){c=d.nodeType===Node.TEXT_NODE...
  function t (line 152) | function t(a,d){return r(a.data.substr(d))?!u(w(a)):!1}
  function A (line 152) | function A(d,b){var c=d.data,m;if(!r(c[b])||a(d.parentNode))return!1;0<b...
  function I (line 152) | function I(a){return(a=/(-?[0-9]*[0-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][...
  function K (line 153) | function K(a){return(a=I(a))&&(0>a.value||"%"===a.unit)?null:a}
  function L (line 153) | function L(a){return(a=I(a))&&"%"!==a.unit?null:a}
  function E (line 153) | function E(a){switch(a.namespaceURI){case odf.Namespaces.drawns:case odf...
  function N (line 154) | function N(a){return Boolean(n(a)&&(!r(a.textContent)||A(a,0)))}
  function O (line 154) | function O(a,d){for(;0<d.length&&!aa.rangeContainsNode(a,d[0]);)d.shift(...
  function D (line 154) | function D(d,b,m){var h;h=aa.getNodesInRange(d,function(d){var b=NodeFil...
  function V (line 155) | function V(a,d,b){for(;a;){if(b(a)){d[0]!==a&&d.unshift(a);break}if(c(a)...
  function W (line 155) | function W(a,d){var b=a;if(d<b.childNodes.length-1)b=b.childNodes[d+1];e...
  function createXPathSingleton (line 165) | function createXPathSingleton(){function g(b,a,d){return-1!==b&&(b<a||-1...
  function g (line 171) | function g(a,d){var b,c,h,m,e,l=0;if(b=K[a.localName])if(h=b[a.namespace...
  function k (line 171) | function k(a,d){var b,c,h,m,e,l=0;if(b=K[a.localName])if(h=b[a.namespace...
  function c (line 172) | function c(a,d){var b,c,h,m,e,l=0;if(b=K[a.localName])if(h=b[a.namespace...
  function b (line 172) | function b(a,d){var h,m;c(a,d);for(h=a.firstChild;h;)h.nodeType===Node.E...
  function f (line 172) | function f(a,d,b){this.key=a;this.name=d;this.family=b;this.requires={}}
  function n (line 172) | function n(a,d,b){var c=a+'"'+d,h=b[c];h||(h=b[c]=
  function p (line 173) | function p(a,d,b){var c,h,m,e,l,f=0;c=a.getAttributeNS(v,"name");e=a.get...
  function r (line 173) | function r(a,d){var b=d[a.family];b||(b=d[a.family]={});b[a.name]=1;Obje...
  function q (line 174) | function q(a,d){var b=p(a,null,{});Object.keys(b).forEach(function(a){a=...
  function e (line 174) | function e(a,d){function b(d){(d=m.getAttributeNS(v,d))&&(a[d]=!0)}var c...
  function l (line 174) | function l(a,d){function b(a){var c=m.getAttributeNS(v,a);c&&d.hasOwnPro...
  function g (line 200) | function g(b){var c=b||{},g=function(b){var a={},d;for(d in b)b.hasOwnPr...
  function k (line 201) | function k(b){return b.replace(/&/g,"&amp;").replace(/</g,"&lt;").replac...
  function c (line 201) | function c(f,n){var g="",r=b.filter?b.filter.acceptNode(n):NodeFilter.FI...
  function g (line 204) | function g(b){var a,d=r.length;for(a=0;a<d;a+=1)if("urn:oasis:names:tc:o...
  function k (line 204) | function k(b,a){var d=new f.UsedStyleList(b,a),c=new odf.OdfNodeFilter;t...
  function c (line 204) | function c(b,a){var d=new k(b,a);this.acceptNode=function(a){var b=
  function b (line 205) | function b(b,a){if(a){var d=g(a),c,h=b.firstChild;if(-1!==d){for(;h;){c=...
  function h (line 208) | function h(a){for(var d=a.firstChild,b;d;)b=d.nextSibling,d.nodeType===N...
  function g (line 208) | function g(a){var d={},b,c,h=a.ownerDocument.createNodeIterator(a,NodeFi...
  function r (line 210) | function r(a,d){for(var b=a&&a.firstChild;b;)b.nodeType===Node.ELEMENT_N...
  function z (line 210) | function z(a,d){for(var b=B.rootElement.meta,b=b&&b.firstChild;b&&(b.nam...
  function w (line 211) | function w(a){var d={},b;for(a=a.firstChild;a;)a.nodeType===Node.ELEMENT...
  function v (line 211) | function v(a,d){var b=null,c,h,e;if(a)for(b=a.cloneNode(!0),c=b.firstEle...
  function u (line 211) | function u(a,d){var b,c,h,e=null,m={};if(a)for(d.forEach(function(a){f.c...
  function t (line 212) | function t(a){var d=B.rootElement.ownerDocument,b;if(a){h(a.documentElem...
  function A (line 212) | function A(a){B.state=a;if(B.onchange)B.onchange(B);if(B.onstatereadycha...
  function I (line 212) | function I(a){Q=null;B.rootElement=a;a.fontFaceDecls=n.getDirectChild(a,...
  function K (line 214) | function K(d){var c=t(d),h=B.rootElement,e;c&&"document-styles"===c.loca...
  function L (line 216) | function L(d){d=t(d);var c,h,e,m;if(d&&"document-content"===d.localName&...
  function E (line 218) | function E(a){a=t(a);var d;a&&"document-meta"===a.localName&&"urn:oasis:...
  function N (line 219) | function N(a){a=t(a);var d;a&&"document-settings"===a.localName&&"urn:oa...
  function O (line 219) | function O(a){a=t(a);var d;if(a&&"manifest"===a.localName&&"urn:oasis:na...
  function D (line 220) | function D(a,d,b){a=n.getElementsByTagName(a,d);var c;for(c=0;c<a.length...
  function V (line 220) | function V(a){D(a,"script",{"urn:oasis:names:tc:opendocument:xmlns:datas...
  function W (line 221) | function W(a){var d=a.firstElementChild,b=[],c,h,e,m=a.attributes,f=m.le...
  function J (line 222) | function J(d){var b=d.shift();b?Y.loadAsDOM(b.path,function(c,h){h&&(V(h...
  function R (line 222) | function R(a){var d="";odf.Namespaces.forEachPrefix(function(a,b){d+=" x...
  function P (line 223) | function P(){var a=new xmldom.LSSerializer,d=R("document-meta");a.filter...
  function aa (line 223) | function aa(a,d){var b=document.createElementNS("urn:oasis:names:tc:open...
  function S (line 224) | function S(){var a=runtime.parseXML('<manifest:manifest xmlns:manifest="...
  function fa (line 224) | function fa(){var a,d,b,c=odf.Namespaces.namespaceMap,
  function ha (line 225) | function ha(){var a,d,b=odf.Namespaces.namespaceMap,h=new xmldom.LSSeria...
  function C (line 226) | function C(d,b){runtime.loadXML(d,function(d,c){if(d)b(d);else if(c){V(c...
  function Z (line 227) | function Z(a,d){var c;c=B.rootElement;var h=c.meta;h||(c.meta=h=document...
  function ba (line 227) | function ba(d,b){function c(a,d){var b;d||(d=a);b=document.createElement...
  function U (line 229) | function U(){var a,d=new Date,b="";B.rootElement.settings&&B.rootElement...
  function ga (line 230) | function ga(a,d){U();Y.writeAs(a,function(a){d(a)})}
  function f (line 237) | function f(d){var b=d.annotationEndElement,c=l.createRange(),e=d.getAttr...
  function n (line 238) | function n(a){var b=g.getSizer();a?(c.style.display="inline-block",b.sty...
  function p (line 238) | function p(){e.sort(function(a,d){return 0!==(a.compareDocumentPosition(...
  function r (line 238) | function r(){var a;for(a=0;a<e.length;a+=
  function q (line 241) | function q(a){var d=e.indexOf(a),b=a.parentNode.parentNode;"div"===b.loc...
  function g (line 246) | function g(c,n,k,r,q){var e,l=0,a;for(a in c)if(c.hasOwnProperty(a)){if(...
  function g (line 249) | function g(a){return(a=A[a])?u.mergeObjects({},a):{}}
  function k (line 249) | function k(){for(var d=a.rootElement.fontFaceDecls,b={},c,e,d=d&&d.first...
  function c (line 249) | function c(d){for(var b=a.rootElement.styles.firstElementChild;b;){if(b....
  function b (line 250) | function b(d,b,c){var e,m,l;c=c||[a.rootElement.automaticStyles,a.rootEl...
  function f (line 250) | function f(a){for(var d,b,c,e,m={},l=a.firstElementChild;l;){if(l.namesp...
  function n (line 251) | function n(d,e){for(var m=a.rootElement.styles,l,n={},k=d.getAttributeNS...
  function p (line 251) | function p(b,c){function h(a){Object.keys(a).forEach(function(d){Object....
  function r (line 252) | function r(d){var c={orderedStyles:[],styleProperties:{}};d.forEach(func...
  function q (line 253) | function q(a,d){var b={},c=[];d||(d={});a.forEach(function(a){p(a,b)});O...
  function e (line 253) | function e(d){for(var b=a.rootElement.masterStyles.firstElementChild;b&&...
  function l (line 254) | function l(a,d){var b;a&&(b=t.convertMeasure(a,"px"));void 0===b&&d&&(b=...
  function n (line 263) | function n(b){var a,d,c,e={};if(!b)return e;for(b=b.firstElementChild;b;...
  function p (line 264) | function p(b,a){if(b.hasOwnProperty(a))return b[a];var d=null,c=Object.k...
  function r (line 264) | function r(b,a,d){var c,e,
  function q (line 265) | function q(b,a){b&&Object.keys(b).forEach(function(d){r(d,b,a)})}
  function g (line 266) | function g(b,c){try{b.insertRule(c,b.cssRules.length)}catch(f){runtime.l...
  function k (line 266) | function k(b,c){this.listCounterCount=0;this.contentRules=b;this.counter...
  function c (line 266) | function c(b){function c(d,h,f,l){var k=h.namespaceURI===n&&"list"===h.l...
  function k (line 269) | function k(a){var b=m.parseLength(a);return b?d.convert(b.value,b.unit,"...
  function e (line 269) | function e(a){return a.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}
  function l (line 269) | function l(a,d){var b;a&&(b=a.getAttributeNS(n,"style-name"));return b===d}
  function a (line 269) | function a(a,
  function g (line 277) | function g(c){var b,f;c=(c=/(-?[0-9]*[0-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1...
  function g (line 279) | function g(a,d,b){var c=[];b=b.derivedStyles;var e;var h=z[a],m;void 0==...
  function k (line 279) | function k(a){var d="",b="",d=null;if("default-style"===a.localName)retu...
  function c (line 280) | function c(a,d){var b="",c,e,h;for(c=0;c<d.length;c+=1)if(e=d[c],h=a.get...
  function b (line 281) | function b(a,d,b,c){return d+d+b+b+c+c}
  function f (line 281) | function f(a,d){var b=[a],c=d.derivedStyles;Object.keys(c).forEach(funct...
  function n (line 281) | function n(a,
  function p (line 282) | function p(a,f,D,V){var z,w;if("page"===
  function h (line 298) | function h(a,d){m="@namespace "+a+" url("+d+");";try{b.insertRule(m,b.cs...
  function g (line 300) | function g(k,c){var b=this;this.getDistance=function(c){var n=b.x-c.x;c=...
  function k (line 300) | function k(a,b,c,e){a=e?"translate3d("+a+"px, "+b+"px, 0) scale3d("+c+",...
  function c (line 300) | function c(a){a?k(-m.x,-m.y,x,!0):(k(0,
  function b (line 301) | function b(a){if(w&&I){var d=w.style.overflow,b=w.classList.contains("we...
  function f (line 301) | function f(){k(-m.x,-m.y,x,!0);w.scrollLeft=0;w.scrollTop=0;K=v.style.ov...
  function n (line 301) | function n(){k(0,0,x,!0);w.scrollLeft=m.x;w.scrollTop=m.y;v.style.overflow=
  function p (line 302) | function p(a){return new g(a.pageX-d.offsetLeft,a.pageY-d.offsetTop)}
  function r (line 302) | function r(a){if(h){m.x-=a.x-h.x;m.y-=a.y-h.y;var b=m;m=new g(Math.min(M...
  function q (line 302) | function q(a){var d=a.touches.length,b=0<d?p(a.touches[0]):null;a=1<d?p(...
  function e (line 302) | function e(a){var b=
  function l (line 303) | function l(){A===t.PINCH&&(u.emit(gui.ZoomHelper.signalZoomChanged,x),n(...
  function a (line 303) | function a(){w&&(w.removeEventListener("touchstart",
  function g (line 306) | function g(){function a(c){b=!0;runtime.setTimeout(function(){try{c()}ca...
  function k (line 306) | function k(a){function d(){for(;0<b.cssRules.length;)b.deleteRule(0);b.i...
  function c (line 307) | function c(a){a=a.sheet;for(var d=a.cssRules;d.length;)a.deleteRule(d.le...
  function b (line 307) | function b(a,d,b){var c=new odf.Style2CSS,e=new odf.ListStyleToCss;
  function f (line 308) | function f(a,d){(new odf.FontLoader).loadFonts(a,d.sheet)}
  function n (line 308) | function n(a,d,b){var c=null;a=a.rootElement.body.getElementsByTagNameNS...
  function p (line 309) | function p(a,d,b,c){var e=a.ownerDocument;d=N.getElementsByTagNameNS(a,d...
  function r (line 309) | function r(a,d,b){d.setAttributeNS("urn:webodf:names:helper","styleid",a...
  function q (line 310) | function q(a){for(a=a.firstChild;a;){if(a.namespaceURI===v&&"binary-data...
  function e (line 311) | function e(a,d,b,c){function e(d){d&&(d='draw|image[webodfhelper|styleid...
  function l (line 311) | function l(a){var d=a.ownerDocument;N.getElementsByTagNameNS(a,I,"line-b...
  function a (line 312) | function a(a){var d=a.ownerDocument;N.getElementsByTagNameNS(a,I,"s").fo...
  function d (line 312) | function d(a){N.getElementsByTagNameNS(a,I,"tab").forEach(function(a){a....
  function m (line 312) | function m(a,d){function b(a,c){var m=f.documentElement.namespaceURI;"vi...
  function h (line 314) | function h(a){var d=a.getElementsByTagName("head")[0],b,c;b=a.styleSheet...
  function y (line 315) | function y(a){var d=parseInt(a.getAttribute("webodfcss"),10);1===d?a.par...
  function x (line 315) | function x(a){var d=a.getElementsByTagName("head")[0],b=a.createElementN...
  function t (line 316) | function t(a,
  function W (line 317) | function W(a,d){function b(a,d){na.addToQueue(function(){m(a,d)})}var c,...
  function w (line 317) | function w(){var a;a=U.firstChild;var d=ea.getZoomLevel();a&&(U.style.We...
  function K (line 318) | function K(b,c){var e=ca.sheet;N.removeAllChildNodes(q);U=ha.createEleme...
  function P (line 323) | function P(a){B?(ga.parentNode||U.appendChild(ga),M&&M.forgetAnnotations...
  function aa (line 324) | function aa(a){function d(){c(F);c(ja);c(ca);N.removeAllChildNodes(q);q....
  function S (line 325) | function S(a){na.clearQueue();N.removeAllChildNodes(q);q.appendChild(q.o...
  function f (line 340) | function f(a,d){var c=this;this.nodeId=a;this.steps=-1;this.node=d;this....
  function n (line 340) | function n(a,d,c){var e=this;this.nodeId=a;this.steps=d;this.node=c;this...
  function p (line 340) | function p(a,d){var b="["+a.nodeId;d&&(b+=" => "+d.nodeId);return b+
  function r (line 341) | function r(){if(!0===ops.StepsCache.ENABLE_CACHE_VERIFICATION){for(var a...
  function q (line 343) | function q(a){var d="";a.nodeType===Node.ELEMENT_NODE&&(d=a.getAttribute...
  function e (line 343) | function e(a){var d=g.toString();a.setAttributeNS("urn:webodf:names:step...
  function l (line 343) | function l(a){var d,b,e=new core.LoopWatchDog(0,1E4);void 0!==z&&a>
  function a (line 344) | function a(a){a.previousBookmark&&(a.previousBookmark.nextBookmark=a.nex...
  function d (line 344) | function d(a){for(var d,b=null;!b&&a&&a!==k;)(d=q(a))&&(b=h[d])&&b.node!...
  function f (line 349) | function f(a,b,c){var e=b.getCurrentNode();b.isBeforeNode()&&r.isParagra...
  function n (line 349) | function n(d,b){if(!b||c.acceptPosition(d)===e)return!0;for(;d.previousP...
  function g (line 353) | function g(b,c){for(;b&&c(b)!==n;)b=b.previousSibling;return b}
  function k (line 353) | function k(b,f,e,l){var a;if(f){if(c.isInlineRoot(f)&&c.isGroupingElemen...
  function RootFilter (line 356) | function RootFilter(g,k,c){var b=core.PositionFilter.FilterResult.FILTER...
  function k (line 357) | function k(a){return new core.PositionIterator(a,A,L,!1)}
  function c (line 357) | function c(){var a=g.odfContainer().getContentElement(),d=a&&a.localName...
  function b (line 357) | function b(){return a.getDocumentElement().ownerDocument}
  function f (line 357) | function f(a){for(;a&&!(a.namespaceURI===odf.Namespaces.officens&&"text"...
  function n (line 357) | function n(a,
  function p (line 358) | function p(a){var d=k(c());a=u.convertStepsToDomPoint(a);d.setUnfiltered...
  function r (line 358) | function r(a){return a===w}
  function q (line 358) | function q(d){var b=d.spec(),c=b.memberid,e=(new Date(b.timestamp)).toIS...
  function e (line 359) | function e(a){var b,c=[],e,f=2;runtime.assert(a.isStep(),"positionIterat...
  function l (line 360) | function l(a,d,b){a=a.childNodes.item(d)||a;return(a=m.getParagraphEleme...
  function g (line 377) | function g(b,c,e){var f=b.getTextNodeAtStep(e,k);f&&(b=f.textNode,e=b.pa...
  function c (line 385) | function c(a,d){var b={};this.generateName=function(){var c=d(),e=0,f;do...
  function b (line 385) | function b(){var a={};[g.rootElement.automaticStyles,g.rootElement.style...
  function b (line 388) | function b(b){function c(a,b){return"object"===typeof a&&"object"===type...
  function f (line 388) | function f(b){var f={};this.applyStyleToContainer=function(a){var d;d=a....
  function n (line 389) | function n(b,c){var a=b.ownerDocument,d=b.parentNode,m,h,f,g=new core.Lo...
  function g (line 392) | function g(b,c,f){var a=b.getOdfCanvas().odfContainer(),d=r.splitBoundar...
  function g (line 394) | function g(b){for(;b;){if(r.isHyperlink(b))return!0;b=b.parentNode}retur...
  function g (line 400) | function g(a,d){var c;if(1===e.length)c=e[0];else if(3===e.length)switch...
  function g (line 405) | function g(b){return"\t"!==b&&p.isODFWhitespace(b)}
  function k (line 409) | function k(c){return b.isODFNode(c)||"br"===c.localName&&b.isLineBreak(c...
  function c (line 409) | function c(n){var p;n.nodeType===Node.TEXT_NODE?(p=n.parentNode,p.remove...
  function g (line 410) | function g(a){return odf.OdfUtils.isInlineRoot(a)?NodeFilter.FILTER_SKIP...
  function k (line 410) | function k(a){if(a.nodeType===Node.TEXT_NODE){if(0===a.length)return run...
  function c (line 411) | function c(d){d.collapsed||(a.splitBoundaries(d),d=l.getTextElements(d,!...
  function b (line 411) | function b(a,d,b){a=a.convertCursorStepToDomPoint(d);var c=l.getParagrap...
  function g (line 417) | function g(b){q.parentNode.insertBefore(b,q)}
  function g (line 428) | function g(b,c,f){var e=[b.getPositionFilter()],g=f.container();f=f.unfi...
  function g (line 434) | function g(c){var f="//dc:creator[@editinfo:memberid='"+k+"']";c=xmldom....
  function g (line 438) | function g(b,c){var e,f,a=c?c.split(","):[];for(e=0;e<a.length;e+=1)f=a[...
  function g (line 441) | function g(c){return function(b){return new c}}
  function k (line 447) | function k(b){f.emit(ops.OdtDocument.signalProcessingBatchStart,b)}
  function c (line 447) | function c(b){f.emit(ops.OdtDocument.signalProcessingBatchEnd,b)}
  function b (line 449) | function b(){var a=r.getCursor(c),a=a&&a.getNode(),b=!1;a&&(b=!l.isWithi...
  function f (line 449) | function f(a){a.getMemberId()===c&&b()}
  function n (line 449) | function n(a){a===c&&b()}
  function p (line 449) | function p(a){a.getMemberId()===c&&b()}
  function g (line 455) | function g(f){f=c.getContentBounds(f);var g,e=null;if(f)if(f.container.n...
  function l (line 456) | function l(a,b){b.process(w,h,k)&&(a=!0,!x&&b.token&&(x=b.token));return a}
  function f (line 458) | function f(){a.style.opacity="0"===a.style.opacity?"1":"0";t.trigger()}
  function n (line 458) | function n(){y.selectNodeContents(h);return y.getBoundingClientRect()}
  function p (line 458) | function p(a){return E[a]!==L[a]}
  function r (line 458) | function r(){Object.keys(L).forEach(function(a){E[a]=L[a]})}
  function q (line 458) | function q(){if(!1===L.isShown||g.getSelectionType()!==ops.OdtCursor.Ran...
  function e (line 461) | function e(a){l.parentNode.removeChild(l);
  function g (line 466) | function g(b){var f="",n=k.filter?k.filter.acceptNode(b):NodeFilter.FILT...
  function k (line 470) | function k(b,c){var k=b+"|"+c,q;f.hasOwnProperty(k)||(q=[],g.forEach(fun...
  function c (line 470) | function c(b,c,f){return function(){var g=k(b,c);return f.length>=g.leng...
  function b (line 470) | function b(b,c){var f=k(b,c);return 1===f.length?f[0]:void 0}
  function r (line 474) | function r(){return U.value().styleSummary}
  function q (line 474) | function q(){return U.value().enabledFeatures}
  function e (line 474) | function e(a){var b;a.collapsed?(b=a.startContainer,b.hasChildNodes()&&a...
  function l (line 474) | function l(){var a=P.getCursor(b),d=a&&a.getSelectedRange(),h=[],h=[],f=...
  function a (line 475) | function a(a,b){var d={};Object.keys(a).forEach(function(c){var e=
  function d (line 476) | function d(){var b,d;d=ba.styleSummary;var c=U.value(),e=c.styleSummary,...
  function m (line 477) | function m(){U.reset();d()}
  function h (line 477) | function h(a){("string"===typeof a?a:a.getMemberId())===b&&U.reset()}
  function y (line 477) | function y(){U.reset()}
  function x (line 477) | function x(a){var d=P.getCursor(b);a=a.paragraphElement;d&&S.getParagrap...
  function z (line 477) | function z(a,b){b(!a());return!0}
  function w (line 477) | function w(a){if(q().directTextStyling){var d=P.getCursorSelection(b),c=...
  function v (line 478) | function v(a,b){var d={};d[a]=b;w(d)}
  function u (line 478) | function u(a){a=a.spec();Z&&a.memberid===b&&"SplitParagraph"!==a.optype&...
  function t (line 478) | function t(a){v("fo:font-weight",a?"bold":"normal")}
  function A (line 478) | function A(a){v("fo:font-style",a?"italic":"normal")}
  function I (line 478) | function I(a){v("style:text-underline-style",a?"solid":"none")}
  function K (line 478) | function K(a){v("style:text-line-through-style",a?"solid":"none")}
  function L (line 478) | function L(a){if(q().directParagraphStyling){var d=P.getCursor(b).getSel...
  function E (line 480) | function E(a){L(function(b){return aa.mergeObjects(b,a)})}
  function N (line 480) | function N(a){E({"style:paragraph-properties":{"fo:text-align":a}})}
  function O (line 480) | function O(a,b){var d=P.getFormatting().getDefaultTabStopDistance(),c=b[...
  function D (line 480) | function D(a,b){var d=e(a),d=0===d.length?[a.startContainer]:
  function V (line 481) | function V(){}
  function W (line 481) | function W(){return!1}
  function J (line 481) | function J(){return!1}
  function g (line 492) | function g(b,c){c||(c=k.None);switch(b){case gui.KeyboardHandler.KeyCode...
  function b (line 495) | function b(){var a=g();runtime.assert(Boolean(a.classList),"Document con...
  function f (line 495) | function f(){var a=g();runtime.assert(Boolean(a.classList),"Document con...
  function n (line 495) | function n(){a.removeEventListener("focus",f,!1);m.forEach(function(a){k...
  function p (line 495) | function p(d){n();
  function k (line 500) | function k(a){function d(a,b,c){var e,h=!1;e="on"+b;a.attachEvent&&(a.at...
  function c (line 501) | function c(a,b,d){function c(b){d(b,e,function(b){b.type=a;h.emit(a,b)})...
  function b (line 502) | function b(a){runtime.clearTimeout(a);delete N[a]}
  function f (line 502) | function f(a,d){var c=runtime.setTimeout(function(){a();b(c)},d);N[c]=!0...
  function n (line 502) | function n(a,d,c){var e=a.touches.length,h=a.touches[0],g=d.timer;"touch...
  function p (line 503) | function p(a,b,d){var c=a.touches[0],e=a.target||a.srcElement||null,h=b....
  function r (line 503) | function r(a,b,d){var c=a.target||a.srcElement||
  function q (line 504) | function q(){L.classList.add("webodf-touchEnabled");E.unsubscribe("touch...
  function e (line 504) | function e(a){var b=a.scrollX,d=a.scrollY;this.restore=function(){a.scro...
  function l (line 504) | function l(a){var b=a.scrollTop,d=a.scrollLeft;this.restore=function(){i...
  function a (line 505) | function a(a,b){var d=I[a]||A[a]||null;!d&&b&&(d=I[a]=new k(a));return d}
  function d (line 505) | function d(b,d){a(b,!0).subscribe(d)}
  function m (line 505) | function m(b,d){var c=a(b,!1);c&&c.unsubscribe(d)}
  function h (line 505) | function h(){return g.getDOMDocument().activeElement===K}
  function y (line 505) | function y(){h()&&K.blur();K.setAttribute("disabled","true")}
  function x (line 505) | function x(){K.removeAttribute("disabled")}
  function z (line 505) | function z(a){for(var b=[];a;)(a.scrollWidth>a.clientWidth||a.scrollHeig...
  function w (line 505) | function w(){var a;
  function k (line 509) | function k(){c.innerHeight!==c.outerHeight&&(b.style.display="none",runt...
  function f (line 510) | function f(){var b=!0;!0===k.getState(gui.CommonConstraints.EDIT.REVIEW_...
  function n (line 510) | function n(c){c.getMemberId()===b&&f()}
  function n (line 515) | function n(){var a=!0;!0===k.getState(gui.CommonConstraints.EDIT.REVIEW_...
  function p (line 515) | function p(a){a.getMemberId()===b&&n()}
  function k (line 522) | function k(){var c=g.getSizer(),k=f.createElement("div");k.id="imageSele...
  function g (line 524) | function g(g){function c(b){p=b.which&&String.fromCharCode(b.which)===n;...
  function b (line 524) | function b(b){a&&(b?a.getNode().setAttributeNS("urn:webodf:names:cursor"...
  function f (line 525) | function f(){x&&(x=!1,b(!1),w.emit(gui.InputMethodEditor.signalCompositi...
  function n (line 525) | function n(){I||(I=!0,f(),a&&a.getSelectedRange().collapsed?d.value="":d...
  function p (line 525) | function p(){c.hasFocus()&&y.trigger()}
  function r (line 525) | function r(){v=void 0;y.cancel();b(!0);x||w.emit(gui.InputMethodEditor.s...
  function q (line 525) | function q(a){a=v=a.data;x=!0;z+=a;y.trigger()}
  function e (line 525) | function e(a){a.data!==
  function l (line 526) | function l(){h.textContent=d.value}
  function c (line 529) | function c(b){n.emit(gui.MetadataController.signalMetadataChanged,b)}
  function b (line 529) | function b(b){var c=-1===p.indexOf(b);c||runtime.log("Setting "+b+" is r...
  function f (line 532) | function f(){r=!0===k.getState(gui.CommonConstraints.EDIT.REVIEW_MODE)?c...
  function n (line 532) | function n(a){a.getMemberId()===b&&f()}
  function k (line 534) | function k(b){return null!==b&&void 0!==f?Math.abs(b-g)>f:!1}
  function c (line 534) | function c(b){null!==b&&!1===k(b)&&(f=Math.abs(b-g))}
  function c (line 537) | function c(a,b,d){for(var c=null,e=g.getRootNode(),f;a!==e&&null!==a&&nu...
  function b (line 537) | function b(a,b){var d;return null===a?m.NO_NEIGHBOUR:p.isCharacterElemen...
  function c (line 541) | function c(a){var b=a.spec();if(a.isEdit||b.memberid===k)I=void 0,K.canc...
  function b (line 541) | function b(){var a=x.getCursor(k).getNode();return x.createStepIterator(...
  function f (line 541) | function f(a,b,d){d=new odf.WordBoundaryFilter(x,d);var c=x.getRootEleme...
  function n (line 541) | function n(a,b){return b?{anchorNode:a.startContainer,anchorOffset:a.sta...
  function p (line 542) | function p(a,b,d){var c=new ops.OpMoveCursor;c.init({memberid:k,position...
  function r (line 542) | function r(a,b,d){var c;c=x.getCursor(k);c=n(c.getSelectedRange(),c.hasF...
  function q (line 542) | function q(a){var b;b=f(a.startContainer,
  function e (line 543) | function e(a){var b=w.getParagraphElements(a),d=b[0],b=b[b.length-1];d&&...
  function l (line 543) | function l(a,b,d,c){var e,f;c?(e=d.startContainer,f=d.startOffset):(e=d....
  function a (line 544) | function a(a,d){var c=b();c.advanceStep(a)&&r(c.container(),c.offset(),d)}
  function d (line 544) | function d(a,d){var c,e=I,f=[new gui.LineBoundaryScanner,new gui.Paragra...
  function m (line 545) | function m(a,d){var c=b(),e=[new gui.LineBoundaryScanner,new gui.Paragra...
  function h (line 545) | function h(a,b){var d=x.getCursor(k),d=n(d.getSelectedRange(),d.hasForwa...
  function y (line 545) | function y(a,b,d){var c=!1,e=x.getCursor(k),
  function p (line 555) | function p(){y=!0===k.getState(gui.CommonConstraints.EDIT.REVIEW_MODE)?c...
  function r (line 555) | function r(a){a.getMemberId()===b&&p()}
  function q (line 555) | function q(a,b,c){var e=[d.getPositionFilter()];c&&e.push(d.createRootFi...
  function e (line 556) | function e(a){var d,c,e,f=m.getParagraphElements(a),g=a.cloneRange(),l=[...
  function l (line 557) | function l(a){0>a.length&&(a.position+=a.length,a.length=-a.length);retu...
  function a (line 557) | function a(a){if(!y)return!1;var c,f=d.getCursor(b).getSelectedRange().c...
  function n (line 565) | function n(a,b){var d=J.getDOMDocument(),c=null;d.caretRangeFromPoint?(d...
  function p (line 565) | function p(a){var b=J.getCursor(c).getSelectedRange();b.collapsed?a.prev...
  function r (line 566) | function r(){return!1!==J.getCursor(c).getSelectedRange().collapsed}
  function q (line 566) | function q(a){var b=J.getCursor(c).getSelectedRange();b.collapsed?a.prev...
  function e (line 566) | function e(a){var b;W.clipboardData&&W.clipboardData.getData?b=W.clipboa...
  function l (line 567) | function l(){return!1}
  function a (line 567) | function a(a){if(Q)Q.onOperationExecuted(a)}
  function d (line 567) | function d(a){J.emit(ops.OdtDocument.signalUndoStackChanged,a)}
  function m (line 567) | function m(){var a;return Q?(a=F.hasFocus(),Q.moveBackward(1),a&&F.focus...
  function h (line 567) | function h(){var a;return Q?(a=F.hasFocus(),Q.moveForward(1),a&&F.focus(...
  function y (line 567) | function y(a){var d=J.getCursor(c).getSelectedRange(),e=(a.target||a.src...
  function x (line 568) | function x(){T.selectRange(b.getSelectedRange(),b.hasForwardSelection(),1)}
  function z (line 568) | function z(){var a=W.getSelection(),d=0<a.rangeCount&&T.selectionToRange...
  function w (line 569) | function w(a){var b=a.target||a.srcElement||null,d=J.getCursor(c);if(U=n...
  function v (line 570) | function v(a){var b=J.getRootElement(a),d=J.createRootFilter(b),b=J.crea...
  function u (line 570) | function u(a){var b;b=(b=W.getSelection())?{anchorNode:b.anchorNode,
  function t (line 572) | function t(a){var b;if(b=n(a.clientX,a.clientY))a=b.container,b=b.offset...
  function A (line 573) | function A(a){var d=a.target||a.srcElement||null,c,e,f;ma.processRequest...
  function I (line 574) | function I(a){var b=J.getCursor(c).getSelectedRange();b.collapsed||fa.ex...
  function K (line 574) | function K(){U&&F.focus();oa=0;B=U=!1}
  function L (line 574) | function L(a){A(a)}
  function E (line 574) | function E(a){var b=a.target||a.srcElement||null,d=null;"annotationRemov...
  function N (line 575) | function N(a){(a=a.data)&&(-1===a.indexOf("\n")?da.insertText(a):ea.past...
  function O (line 575) | function O(a){return function(){a();return!0}}
  function D (line 575) | function D(a){return function(b){return J.getCursor(c).getSelectionType(...
  function V (line 575) | function V(b){F.unsubscribe("keydown",C.handleEvent);F.unsubscribe("keyp...
  function c (line 594) | function c(b){return n.hasOwnProperty(b)?n[b]:null}
  function b (line 594) | function b(){return Object.keys(n).map(function(b){return n[b]})}
  function f (line 594) | function f(b){var c=n[b];c&&(delete n[b],b===g.getInputMemberId()?(r.uns...
  function c (line 601) | function c(){var b=[],c;for(c in f)f.hasOwnProperty(c)&&b.push({memberid...
  function c (line 603) | function c(b,a){return runtime.setTimeout(function(){p.style.opacity=b},a)}
  function k (line 609) | function k(){var b=odf.OdfSchema.getFields().map(function(b){return b.re...
  function k (line 613) | function k(){return Object.keys(c).map(function(b){return c[b]})}
  function c (line 614) | function c(k,r){r?b(r):k<g.length?g[k].destroy(function(b){c(k+1,b)}):b()}
  function g (line 615) | function g(g,c){return void 0!==g?Boolean(g):c}
  function r (line 615) | function r(a){a.memberId===c&&I.getViewport().scrollIntoView(a.annotatio...
  function q (line 615) | function q(){var a=document.getElementsByTagName("head").item(0),b=docum...
  function e (line 615) | function e(a,b,d){function e(b,d,c){d=b+'[editinfo|memberid="'+a+'"]'+c+...
  function l (line 617) | function l(a){var b,d;for(d in t)t.hasOwnProperty(d)&&(b=t[d],a?b.show()...
  function a (line 617) | function a(a){n.getCarets().forEach(function(b){a?b.showHandle():b.hideH...
  function d (line 617) | function d(a){var b=a.getMemberId();a=a.getProperties();e(b,a.fullName,a...
  function m (line 617) | function m(a){var d=
  function h (line 618) | function h(a){a=a.getMemberId();var b=p.getSelectionView(c),d=p.getSelec...
  function y (line 619) | function y(a){p.removeSelectionView(a)}
  function x (line 619) | function x(a){var d=a.paragraphElement,c=a.memberId;a=a.timeStamp;var e,...
  function z (line 620) | function z(){var a;u.hasChildNodes()&&core.DomUtils.removeAllChildNodes(...
  function w (line 620) | function w(a){var b=Object.keys(t).map(function(a){return t[a]});A.unsub...
  function k (line 626) | function k(){var a=d.getRootNode();m!==a&&(m=a,h=d.getCanvas().getSizer(...
  function c (line 626) | function c(a){a=a.getBoundingClientRect();return Boolean(a&&0!==a.height)}
  function b (line 626) | function b(a){var b=
  function f (line 628) | function f(a,b){var d={};d.top=Math.min(a.top,b.top);d.left=
  function n (line 629) | function n(a,b){b&&0<b.width&&0<b.height&&(a=a?f(a,b):b);return a}
  function p (line 629) | function p(a){function b(a){K.setUnfilteredPosition(a,0);return v.accept...
  function r (line 632) | function r(a,b){var d=a.getBoundingClientRect(),c={width:0};c.top=d.top;...
  function q (line 632) | function q(){var a=g.getSelectedRange(),d;if(d=I&&g.getSelectionType()==...
  function e (line 634) | function e(a){I&&a===g&&N.trigger()}
  function l (line 634) | function l(a){a=8/a;w.setAttribute("r",a);v.setAttribute("r",a)}
  function a (line 634) | function a(a){h.removeChild(x);h.classList.remove("webodf-virtualSelecti...
  function g (line 637) | function g(b,c){var g=b.length;this.previous=function(){for(--g;0<=g;--g...
  function k (line 637) | function k(b){b=b.spec();var c;b.hasOwnProperty("position")&&(c=b.positi...
  function c (line 637) | function c(b){return b.isEdit}
  function b (line 637) | function b(b,c,g){if(!g)return g=k(b)-k(c),0===g||1===Math.abs(g);b=k(b)...
  function g (line 640) | function g(b,c){this.mainId=void 0!==b?b:-1;this.subId=void 0!==c?c:-1}
  function k (line 640) | function k(b,f,k){function p(c,a){return c+(b.isEditOperation(a)?1:0)}va...
  function c (line 640) | function c(){return!0!==u.isNextStateId(v)}
  function n (line 641) | function n(a){a=a.getOperations();0<a.length&&(L=!0,z(a),L=!1)}
  function p (line 641) | function p(){I.emit(gui.UndoManager.signalUndoStackChanged,{undoAvailabl...
  function r (line 641) | function r(a){var b=c();a!==b&&I.emit(gui.UndoManager.signalDocumentModi...
  function q (line 641) | function q(){u!==x&&u!==t[t.length-1]&&t.push(u)}
  function e (line 641) | function e(a){var b=a.previousSibling||a.nextSibling;a.parentNode.remove...
  function l (line 641) | function l(a){return Object.keys(a).map(function(b){return a[b]})}
  function a (line 641) | function a(a){function b(a){var h=
  function d (line 642) | function d(){var b=c(),d=y=w.cloneDocumentElement();h.getElementsByTagNa...
  function c (line 659) | function c(c,a){var d,f;c.hasAttributeNS(b,"parent-style-name")&&(f=c.ge...
  function k (line 662) | function k(a,b,d,c){b=d.getAttributeNS(b,"class-names");var e;if(b)for(b...
  function c (line 662) | function c(a,b){var d=x.getStyleName("paragraph",a);void 0!==d&&(b.push(...
  function b (line 662) | function b(a,b,d){var c=[],e,h,f,g;for(e=0;e<a.length;e+=2)f=a[e],g=a[e+...
  function f (line 663) | function f(a,b){var d=x.getStyleName("text",a),e=a.parentNode;void 0!==d...
  function n (line 663) | function n(a){a=a.getAttributeNS(y,"family");return r[a]}
  function g (line 669) | function g(a){a.position+=a.length;a.length*=-1}
  function k (line 669) | function k(a){var b=0>a.length;b&&g(a);return b}
  function c (line 669) | function c(a,b){function c(f){a[f]===b&&e.push(f)}var e=[];a&&["style:pa...
  function b (line 669) | function b(a,b){function c(e){a[e]===b&&delete a[e]}a&&["style:parent-st...
  function f (line 669) | function f(a){var b={};Object.keys(a).forEach(function(c){b[c]="object"=...
  function n (line 669) | function n(a,
  function p (line 671) | function p(a){for(var b in a)if(a.hasOwnProperty(b))return!0;return!1}
  function r (line 671) | function r(a){for(var b in a)if(a.hasOwnProperty(b)&&("attributes"!==b||...
  function q (line 671) | function q(a,b,c,e,f){var g=a?a[f]:null,k=b?b[f]:null,l=c?c[f]:null,q=e?...
  function e (line 671) | function e(a,b){return{opSpecsA:[a],opSpecsB:[b]}}
  function g (line 707) | function g(c,b){for(var f,n,p=[],r=[];0<c.length&&b;){f=c.shift();f=k.tr...
  function s (line 721) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function CompressedObject (line 724) | function CompressedObject(){this.compressedSize=0;this.uncompressedSize=...
  function DataReader (line 732) | function DataReader(data){this.data=null;this.length=0;this.index=0}
  function JSZip (line 737) | function JSZip(data,options){if(!(this instanceof JSZip))return new JSZi...
  function NodeBufferReader (line 740) | function NodeBufferReader(data){this.data=data;this.length=this.data.len...
  function StringReader (line 763) | function StringReader(data,optimizedBinaryString){this.data=data;if(!opt...
  function Uint8ArrayReader (line 766) | function Uint8ArrayReader(data){if(data){this.data=data;this.length=this...
  function identity (line 775) | function identity(input){return input}
  function stringToArrayLike (line 775) | function stringToArrayLike(str,array){for(var i=0;i<str.length;++i)array...
  function arrayLikeToString (line 775) | function arrayLikeToString(array){var chunk=65536;var result=[],len=arra...
  function arrayLikeToArrayLike (line 777) | function arrayLikeToArrayLike(arrayFrom,arrayTo){for(var i=0;i<arrayFrom...
  function ZipEntries (line 783) | function ZipEntries(data,loadOptions){this.files=[];this.loadOptions=loa...
  function ZipEntry (line 792) | function ZipEntry(options,loadOptions){this.options=options;this.loadOpt...
  function deflate (line 807) | function deflate(input,options){var deflator=new Deflate(options);deflat...
  function deflateRaw (line 807) | function deflateRaw(input,
  function gzip (line 808) | function gzip(input,options){options=options||{};options.gzip=true;retur...
  function inflate (line 813) | function inflate(input,options){var inflator=
  function inflateRaw (line 814) | function inflateRaw(input,options){options=options||{};options.raw=true;...
  function buf2binstring (line 820) | function buf2binstring(buf,len){if(len<65537)if(buf.subarray&&STR_APPLY_...
  function adler32 (line 822) | function adler32(adler,buf,len,pos){var s1=adler&65535|0,s2=adler>>>16&6...
  function makeTable (line 824) | function makeTable(){var c,table=[];for(var n=0;n<256;n++){c=n;for(var k...
  function crc32 (line 824) | function crc32(crc,buf,len,pos){var t=crcTable,end=pos+len;crc=crc^-1;fo...
  function err (line 826) | function err(strm,errorCode){strm.msg=
  function rank (line 827) | function rank(f){return(f<<1)-(f>4?9:0)}
  function zero (line 827) | function zero(buf){var len=buf.length;while(--len>=0)buf[len]=0}
  function flush_pending (line 827) | function flush_pending(strm){var s=strm.state;var len=s.pending;if(len>s...
  function flush_block_only (line 827) | function flush_block_only(s,last){trees._tr_flush_block(s,
  function put_byte (line 828) | function put_byte(s,b){s.pending_buf[s.pending++]=b}
  function putShortMSB (line 828) | function putShortMSB(s,b){s.pending_buf[s.pending++]=b>>>8&255;s.pending...
  function read_buf (line 828) | function read_buf(strm,buf,start,size){var len=strm.avail_in;if(len>size...
  function longest_match (line 829) | function longest_match(s,cur_match){var chain_length=s.max_chain_length;...
  function fill_window (line 831) | function fill_window(s){var _w_size=s.w_size;var p,n,m,more,str;do{more=...
  function deflate_stored (line 833) | function deflate_stored(s,flush){var max_block_size=65535;if(max_block_s...
  function deflate_fast (line 835) | function deflate_fast(s,flush){var hash_head;var bflush;for(;;){if(s.loo...
  function deflate_slow (line 838) | function deflate_slow(s,flush){var hash_head;var bflush;var max_insert;f...
  function deflate_rle (line 842) | function deflate_rle(s,flush){var bflush;var prev;var scan,strend;var _w...
  function deflate_huff (line 844) | function deflate_huff(s,flush){var bflush;for(;;){if(s.lookahead===0){fi...
  function lm_init (line 846) | function lm_init(s){s.window_size=2*s.w_size;zero(s.head);s.max_lazy_mat...
  function DeflateState (line 847) | function DeflateState(){this.strm=null;this.status=0;this.pending_buf=nu...
  function deflateResetKeep (line 850) | function deflateResetKeep(strm){var s;if(!strm||!strm.state)return err(s...
  function deflateReset (line 850) | function deflateReset(strm){var ret=deflateResetKeep(strm);if(ret===Z_OK...
  function deflateSetHeader (line 850) | function deflateSetHeader(strm,head){if(!strm||
  function deflateInit2 (line 851) | function deflateInit2(strm,level,method,windowBits,memLevel,strategy){if...
  function deflateInit (line 853) | function deflateInit(strm,level){return deflateInit2(strm,level,Z_DEFLAT...
  function deflate (line 853) | function deflate(strm,flush){var old_flush,s;var beg,val;if(!strm||!strm...
  function deflateEnd (line 863) | function deflateEnd(strm){var status;if(!strm||!strm.state)return Z_STRE...
  function GZheader (line 864) | function GZheader(){this.text=0;this.time=0;this.xflags=0;this.os=0;
  function ZSWAP32 (line 873) | function ZSWAP32(q){return(q>>>24&255)+(q>>>8&65280)+((q&65280)<<8)+((q&...
  function InflateState (line 873) | function InflateState(){this.mode=0;this.last=false;this.wrap=0;this.hav...
  function inflateResetKeep (line 874) | function inflateResetKeep(strm){var state;if(!strm||!strm.state)return Z...
  function inflateReset (line 875) | function inflateReset(strm){var state;if(!strm||!strm.state)return Z_STR...
  function inflateReset2 (line 875) | function inflateReset2(strm,windowBits){var wrap;var state;if(!strm||!st...
  function inflateInit2 (line 876) | function inflateInit2(strm,windowBits){var ret;var state;if(!strm)return...
  function inflateInit (line 877) | function inflateInit(strm){return inflateInit2(strm,DEF_WBITS)}
  function fixedtables (line 877) | function fixedtables(state){if(virgin){var sym;lenfix=new utils.Buf32(51...
  function updatewindow (line 878) | function updatewindow(strm,src,end,copy){var dist;var state=strm.state;i...
  function inflate (line 879) | function inflate(strm,flush){var state;var input,output;var next;var put...
  function inflateEnd (line 905) | function inflateEnd(strm){if(!strm||
  function inflateGetHeader (line 906) | function inflateGetHeader(strm,head){var state;if(!strm||!strm.state)ret...
  function zero (line 913) | function zero(buf){var len=
  function d_code (line 916) | function d_code(dist){return dist<256?_dist_code[dist]:_dist_code[256+
  function put_short (line 917) | function put_short(s,w){s.pending_buf[s.pending++]=w&255;s.pending_buf[s...
  function send_bits (line 917) | function send_bits(s,value,length){if(s.bi_valid>Buf_size-length){s.bi_b...
  function send_code (line 917) | function send_code(s,c,tree){send_bits(s,tree[c*2],tree[c*2+1])}
  function bi_reverse (line 917) | function bi_reverse(code,len){var res=0;do{res|=code&1;code>>>=1;res<<=1...
  function bi_flush (line 918) | function bi_flush(s){if(s.bi_valid===16){put_short(s,s.bi_buf);s.bi_buf=...
  function gen_bitlen (line 918) | function gen_bitlen(s,desc){var tree=desc.dyn_tree;var max_code=desc.max...
  function gen_codes (line 920) | function gen_codes(tree,max_code,bl_count){var next_code=new Array(MAX_B...
  function tr_static_init (line 921) | function tr_static_init(){var n;var bits;var length;var code;var dist;va...
  function init_block (line 923) | function init_block(s){var n;for(n=0;n<L_CODES;n++)s.dyn_ltree[n*2]=0;fo...
  function bi_windup (line 923) | function bi_windup(s){if(s.bi_valid>8)put_short(s,s.bi_buf);else if(s.bi...
  function copy_block (line 924) | function copy_block(s,buf,len,header){bi_windup(s);if(header){put_short(...
  function smaller (line 924) | function smaller(tree,n,m,depth){var _n2=n*2;var _m2=m*2;return tree[_n2...
  function pqdownheap (line 924) | function pqdownheap(s,tree,k){var v=s.heap[k];var j=k<<1;while(j<=s.heap...
  function compress_block (line 925) | function compress_block(s,ltree,dtree){var dist;var lc;var lx=0;var code...
  function build_tree (line 926) | function build_tree(s,desc){var tree=desc.dyn_tree;var stree=desc.stat_d...
  function scan_tree (line 928) | function scan_tree(s,tree,max_code){var n;var prevlen=-1;var curlen;var ...
  function send_tree (line 929) | function send_tree(s,tree,max_code){var n;var prevlen=-1;var curlen;var ...
  function build_bl_tree (line 930) | function build_bl_tree(s){var max_blindex;
  function send_all_trees (line 931) | function send_all_trees(s,lcodes,dcodes,blcodes){var rank;send_bits(s,lc...
  function detect_data_type (line 932) | function detect_data_type(s){var black_mask=4093624447;var n;for(n=0;n<=...
  function _tr_init (line 932) | function _tr_init(s){if(!static_init_done){tr_static_init();static_init_...
  function _tr_stored_block (line 933) | function _tr_stored_block(s,buf,stored_len,last){send_bits(s,(STORED_BLO...
  function _tr_align (line 933) | function _tr_align(s){send_bits(s,STATIC_TREES<<1,3);send_code(s,END_BLO...
  function _tr_flush_block (line 933) | function _tr_flush_block(s,buf,stored_len,last){var opt_lenb,static_lenb...
  function _tr_tally (line 935) | function _tr_tally(s,dist,lc){s.pending_buf[s.d_buf+s.last_lit*2]=dist>>...
  function ZStream (line 936) | function ZStream(){this.input=null;this.next_in=0;this.avail_in=0;this.t...

FILE: attachment_preview/static/src/js/attachmentPreviewWidget.esm.js
  class AttachmentPreviewWidget (line 5) | class AttachmentPreviewWidget extends Component {
    method setup (line 8) | setup() {
    method _onCloseClick (line 24) | _onCloseClick() {
    method _onPreviousClick (line 28) | _onPreviousClick() {
    method _onNextClick (line 32) | _onNextClick() {
    method _onPopoutClick (line 36) | _onPopoutClick() {
    method next (line 42) | next() {
    method previous (line 52) | previous() {
    method show (line 62) | show() {
    method hide (line 66) | hide() {
    method updatePaginator (line 70) | updatePaginator() {
    method loadPreview (line 79) | loadPreview() {
    method setAttachments (line 88) | setAttachments(attachments, active_attachment_id) {
    method _onAttachmentPreview (line 100) | _onAttachmentPreview(attachment_id, attachment_info_list) {

FILE: attachment_preview/static/src/js/mail_core/attachment_list.esm.js
  method _onPreviewAttachment (line 6) | _onPreviewAttachment(attachment) {
  method _canPreviewAttachment (line 20) | _canPreviewAttachment(attachment) {

FILE: attachment_preview/static/src/js/utils.esm.js
  function canPreview (line 3) | function canPreview(extension) {
  function getUrl (line 19) | function getUrl(
  function showPreview (line 63) | function showPreview(

FILE: attachment_preview/static/src/js/web_views/fields/binary_field.esm.js
  method setup (line 10) | setup() {
  method _preview_onMounted (line 16) | async _preview_onMounted() {
  method _renderPreviewButton (line 34) | _renderPreviewButton(extension) {
  method _onPreview (line 48) | _onPreview(event) {

FILE: attachment_preview/static/src/js/web_views/form/form_compiler.esm.js
  method compile (line 6) | compile(node, params) {

FILE: attachment_preview/static/src/js/web_views/form/form_controller.esm.js
  method onWillLoadRoot (line 5) | onWillLoadRoot(nextConfiguration) {

FILE: attachment_preview/static/src/js/web_views/form/form_renderer.esm.js
  method setup (line 6) | setup() {

FILE: attachment_preview/tests/test_attachment_preview.py
  class TestAttachmentPreview (line 10) | class TestAttachmentPreview(BaseCommon):
    method test_get_extension (line 11) | def test_get_extension(self):

FILE: attachment_zipped_download/controllers/main.py
  class AttachmentZippedDownloadController (line 8) | class AttachmentZippedDownloadController(http.Controller):
    method download_zip (line 10) | def download_zip(self, ids=None, debug=0):

FILE: attachment_zipped_download/models/ir_attachment.py
  class IrAttachment (line 11) | class IrAttachment(models.Model):
    method action_attachments_download (line 14) | def action_attachments_download(self):
    method _create_temp_zip (line 27) | def _create_temp_zip(self):
    method _compute_zip_file_name (line 40) | def _compute_zip_file_name(self):

FILE: attachment_zipped_download/models/ir_attachment_action_download.py
  class IrAttachmentActionDownloadMixin (line 7) | class IrAttachmentActionDownloadMixin(models.AbstractModel):
    method _get_downloadable_attachments (line 13) | def _get_downloadable_attachments(self):
    method action_download_attachments (line 26) | def action_download_attachments(self):

FILE: attachment_zipped_download/tests/models/res_partner.py
  class ResPartner (line 7) | class ResPartner(models.Model):

FILE: attachment_zipped_download/tests/test_attachment_zipped_download.py
  class TestAttachmentZippedDownloadBase (line 11) | class TestAttachmentZippedDownloadBase(BaseCommon):
    method _create_attachment (line 13) | def _create_attachment(cls, user, name, model=False, res_id=False):
  class TestAttachmentZippedDownload (line 28) | class TestAttachmentZippedDownload(HttpCase, TestAttachmentZippedDownloa...
    method setUpClass (line 30) | def setUpClass(cls):
    method test_action_attachments_download (line 37) | def test_action_attachments_download(self):
  class TestAttachmentZipped (line 44) | class TestAttachmentZipped(TestAttachmentZippedDownloadBase):
    method setUpClass (line 46) | def setUpClass(cls):
    method test_create_temp_zip (line 64) | def test_create_temp_zip(self):
    method test_create_temp_zip_access_denined (line 68) | def test_create_temp_zip_access_denined(self):

FILE: attachment_zipped_download/tests/test_ir_attachment_action_download.py
  class TestMixin (line 9) | class TestMixin(TestAttachmentZippedDownloadBase):
    method setUpClass (line 11) | def setUpClass(cls):
    method test_action_download_attachments_no_attachment (line 45) | def test_action_download_attachments_no_attachment(self):
    method test_action_download_attachments_one_attachment (line 50) | def test_action_download_attachments_one_attachment(self):
    method test_action_download_attachments_two_attachment_one_record (line 58) | def test_action_download_attachments_two_attachment_one_record(self):
    method test_action_download_attachments_three_attachment_n_records (line 66) | def test_action_download_attachments_three_attachment_n_records(self):

FILE: document_knowledge/models/ir_attachment.py
  class IrAttachment (line 7) | class IrAttachment(models.Model):

FILE: document_knowledge/models/res_config.py
  class DocumentKnowledgeConfigSettings (line 7) | class DocumentKnowledgeConfigSettings(models.TransientModel):

FILE: document_page/models/document_page.py
  class DocumentPage (line 8) | class DocumentPage(models.Model):
    method _compute_backend_url (line 101) | def _compute_backend_url(self):
    method _check_parent_id (line 116) | def _check_parent_id(self):
    method _get_page_index (line 120) | def _get_page_index(self, link=True):
    method _compute_content (line 134) | def _compute_content(self):
    method _inverse_content (line 145) | def _inverse_content(self):
    method _create_history (line 157) | def _create_history(self, vals):
    method _search_content (line 161) | def _search_content(self, operator, value):
    method _compute_history_head (line 165) | def _compute_history_head(self):
    method _onchange_parent_id (line 173) | def _onchange_parent_id(self):
    method unlink (line 181) | def unlink(self):
    method copy (line 187) | def copy(self, default=None):

FILE: document_page/models/document_page_history.py
  class DocumentPageHistory (line 12) | class DocumentPageHistory(models.Model):
    method _compute_diff (line 35) | def _compute_diff(self):
    method _get_diff (line 49) | def _get_diff(self, v1, v2):
    method _compute_display_name (line 55) | def _compute_display_name(self):

FILE: document_page/models/ir_ui_menu.py
  class IrUiMenu (line 7) | class IrUiMenu(models.Model):
    method _visible_menu_ids (line 10) | def _visible_menu_ids(self, debug=False):

FILE: document_page/static/src/js/document_page_kanban_controller.esm.js
  class DocumentPageKanbanController (line 3) | class DocumentPageKanbanController extends KanbanController {
    method openRecord (line 7) | async openRecord(record) {

FILE: document_page/tests/test_document_page.py
  class TestDocumentPage (line 5) | class TestDocumentPage(common.TransactionCase):
    method setUp (line 6) | def setUp(self):
    method test_page_creation (line 13) | def test_page_creation(self):
    method test_category_template (line 26) | def test_category_template(self):
    method test_page_history_diff (line 33) | def test_page_history_diff(self):
    method test_page_link (line 40) | def test_page_link(self):
    method test_page_copy (line 55) | def test_page_copy(self):

FILE: document_page/tests/test_document_page_create_menu.py
  class TestDocumentPageCreateMenu (line 5) | class TestDocumentPageCreateMenu(common.TransactionCase):
    method test_page_menu_creation (line 8) | def test_page_menu_creation(self):
    method test_page_menu_parent_id_context (line 31) | def test_page_menu_parent_id_context(self):

FILE: document_page/tests/test_document_page_history.py
  class TestDocumentPageHistory (line 4) | class TestDocumentPageHistory(common.TransactionCase):
    method test_page_history_demo_page1 (line 7) | def test_page_history_demo_page1(self):

FILE: document_page/tests/test_document_page_show_diff.py
  class TestDocumentPageShowDiff (line 6) | class TestDocumentPageShowDiff(common.TransactionCase):
    method test_show_demo_page1_diff (line 9) | def test_show_demo_page1_diff(self):

FILE: document_page/wizard/document_page_create_menu.py
  class DocumentPageCreateMenu (line 7) | class DocumentPageCreateMenu(models.TransientModel):
    method default_get (line 17) | def default_get(self, fields_list):
    method document_page_menu_create (line 26) | def document_page_menu_create(self):

FILE: document_page/wizard/document_page_show_diff.py
  class DocumentPageShowDiff (line 8) | class DocumentPageShowDiff(models.TransientModel):
    method _get_diff (line 14) | def _get_diff(self):

FILE: document_page_access_group/models/document_page.py
  class DocumentPage (line 9) | class DocumentPage(models.Model):
    method check_document_page_groups_users (line 16) | def check_document_page_groups_users(self):

FILE: document_page_access_group/tests/common.py
  class TestDocumentPageAccessGroupBase (line 8) | class TestDocumentPageAccessGroupBase(BaseCommon):
    method setUpClass (line 10) | def setUpClass(cls):

FILE: document_page_access_group/tests/test_document_page_access_group.py
  class TestDocumentPageAccessGroup (line 9) | class TestDocumentPageAccessGroup(TestDocumentPageAccessGroupBase):
    method test_page_access_constrains (line 10) | def test_page_access_constrains(self):
    method test_page_access_01 (line 15) | def test_page_access_01(self):
    method test_page_access_02 (line 22) | def test_page_access_02(self):

FILE: document_page_access_group_user_role/models/document_page.py
  class DocumentPage (line 7) | class DocumentPage(models.Model):
    method _compute_user_ids (line 20) | def _compute_user_ids(self):

FILE: document_page_access_group_user_role/tests/test_document_page_access_group_user_role.py
  class TestDocumentPageAccessGroupUserRole (line 10) | class TestDocumentPageAccessGroupUserRole(TestDocumentPageAccessGroupBase):
    method setUpClass (line 12) | def setUpClass(cls):
    method test_document_page_role_misc (line 29) | def test_document_page_role_misc(self):
    method test_document_page_role_access_01 (line 34) | def test_document_page_role_access_01(self):
    method test_document_page_role_access_02 (line 42) | def test_document_page_role_access_02(self):

FILE: document_page_approval/hooks.py
  function post_init_hook (line 8) | def post_init_hook(env):  # pragma: no cover
  function uninstall_hook (line 22) | def uninstall_hook(env):  # pragma: no cover

FILE: document_page_approval/models/document_page.py
  class DocumentPage (line 9) | class DocumentPage(models.Model):
    method _valid_field_parameter (line 69) | def _valid_field_parameter(self, field, name):
    method _compute_is_approval_required (line 73) | def _compute_is_approval_required(self):
    method _compute_approver_group_ids (line 82) | def _compute_approver_group_ids(self):
    method _compute_am_i_approver (line 91) | def _compute_am_i_approver(self):
    method can_user_approve_this_page (line 96) | def can_user_approve_this_page(self, user):
    method _compute_has_changes_pending_approval (line 114) | def _compute_has_changes_pending_approval(self):
    method _compute_user_has_drafts (line 122) | def _compute_user_has_drafts(self):
    method _create_history (line 130) | def _create_history(self, vals):
    method action_changes_pending_approval (line 135) | def action_changes_pending_approval(self):

FILE: document_page_approval/models/document_page_history.py
  class DocumentPageHistory (line 11) | class DocumentPageHistory(models.Model):
    method action_draft (line 44) | def action_draft(self):
    method action_to_approve (line 58) | def action_to_approve(self):
    method action_approve (line 92) | def action_approve(self):
    method action_cancel (line 131) | def action_cancel(self):
    method action_cancel_and_draft (line 141) | def action_cancel_and_draft(self):
    method _compute_am_i_owner (line 146) | def _compute_am_i_owner(self):
    method _compute_page_url (line 151) | def _compute_page_url(self):
    method _compute_diff (line 165) | def _compute_diff(self):

FILE: document_page_approval/tests/test_document_page_approval.py
  class TestDocumentPageApproval (line 9) | class TestDocumentPageApproval(BaseCommon):
    method setUpClass (line 11) | def setUpClass(cls):
    method test_approval_required (line 50) | def test_approval_required(self):
    method test_change_request_approve (line 58) | def test_change_request_approve(self):
    method test_change_request_auto_approve (line 93) | def test_change_request_auto_approve(self):
    method test_change_request_from_scratch (line 101) | def test_change_request_from_scratch(self):
    method test_get_approvers_guids (line 138) | def test_get_approvers_guids(self):
    method test_get_page_url (line 143) | def test_get_page_url(self):
    method test_compute_is_approval_required (line 149) | def test_compute_is_approval_required(self):
    method test_compute_approver_group_ids (line 156) | def test_compute_approver_group_ids(self):
    method test_can_user_approve_this_page (line 163) | def test_can_user_approve_this_page(self):
    method test_pending_approval_detection (line 176) | def test_pending_approval_detection(self):
    method test_user_has_drafts (line 195) | def test_user_has_drafts(self):
    method test_action_draft_requires_cancellation (line 209) | def test_action_draft_requires_cancellation(self):
    method test_action_to_approve_only_from_draft (line 220) | def test_action_to_approve_only_from_draft(self):
    method test_approval_permission_check (line 231) | def test_approval_permission_check(self):
    method test_page_url_computation (line 247) | def test_page_url_computation(self):
    method test_diff_computation (line 252) | def test_diff_computation(self):

FILE: document_page_group/models/document_page.py
  class DocumentPage (line 7) | class DocumentPage(models.Model):
    method _compute_group_ids (line 29) | def _compute_group_ids(self):

FILE: document_page_group/tests/test_document_page_group.py
  class TestDocumentPageGroup (line 9) | class TestDocumentPageGroup(BaseCommon):
    method setUpClass (line 11) | def setUpClass(cls):
    method test_document_page_group (line 34) | def test_document_page_group(self):

FILE: document_page_partner/models/document_page.py
  class DocumentPage (line 6) | class DocumentPage(models.Model):

FILE: document_page_product/models/document_page.py
  class DocumentPage (line 7) | class DocumentPage(models.Model):
    method _compute_product_template_count (line 20) | def _compute_product_template_count(self):
    method action_product_templates (line 24) | def action_product_templates(self):

FILE: document_page_product/models/product.py
  class ProductTemplate (line 7) | class ProductTemplate(models.Model):
    method _compute_document_page_count (line 20) | def _compute_document_page_count(self):
  class ProductProduct (line 25) | class ProductProduct(models.Model):
    method _compute_document_page_count (line 31) | def _compute_document_page_count(self):
    method action_document_page_products (line 35) | def action_document_page_products(self):

FILE: document_page_product/tests/test_document_page_product.py
  class TestDesguaceparisCustom (line 8) | class TestDesguaceparisCustom(BaseCommon):
    method setUpClass (line 10) | def setUpClass(cls):
    method test_page_count (line 18) | def test_page_count(self):

FILE: document_page_project/models/document_page.py
  class DocumentPage (line 7) | class DocumentPage(models.Model):

FILE: document_page_project/models/project_project.py
  class ProjectProject (line 7) | class ProjectProject(models.Model):
    method _compute_document_page_count (line 15) | def _compute_document_page_count(self):

FILE: document_page_project/tests/test_project_project.py
  class TestProjectProject (line 7) | class TestProjectProject(common.TransactionCase):
    method setUpClass (line 9) | def setUpClass(cls):
    method test_page_count (line 16) | def test_page_count(self):

FILE: document_page_project_task/models/document_page.py
  class DocumentPage (line 8) | class DocumentPage(models.Model):
    method _onchange_task_ids (line 20) | def _onchange_task_ids(self):
    method _onchange_project_id (line 28) | def _onchange_project_id(self):
    method _check_task_project_consistency (line 36) | def _check_task_project_consistency(self):
    method default_get (line 55) | def default_get(self, fields_list):

FILE: document_page_project_task/models/project_task.py
  class ProjectTask (line 7) | class ProjectTask(models.Model):
    method _compute_document_page_count (line 20) | def _compute_document_page_count(self):

FILE: document_page_project_task/tests/test_document_page.py
  class TestDocumentPage (line 8) | class TestDocumentPage(common.TransactionCase):
    method setUpClass (line 10) | def setUpClass(cls):
    method test_onchange_task_ids_fills_project_single_project (line 23) | def test_onchange_task_ids_fills_project_single_project(self):
    method test_onchange_task_ids_does_not_fill_project_multiple_projects (line 35) | def test_onchange_task_ids_does_not_fill_project_multiple_projects(self):
    method test_onchange_task_ids_skips_when_project_already_set (line 46) | def test_onchange_task_ids_skips_when_project_already_set(self):
    method test_onchange_project_id_filters_incompatible_tasks (line 58) | def test_onchange_project_id_filters_incompatible_tasks(self):
    method test_onchange_project_id_keeps_compatible_tasks (line 76) | def test_onchange_project_id_keeps_compatible_tasks(self):
    method test_onchange_project_cleared_keeps_tasks (line 90) | def test_onchange_project_cleared_keeps_tasks(self):
    method test_default_get_with_task_in_context (line 108) | def test_default_get_with_task_in_context(self):
    method test_constraint_valid_tasks_same_project (line 125) | def test_constraint_valid_tasks_same_project(self):
    method test_constraint_invalid_task_different_project (line 136) | def test_constraint_invalid_task_different_project(self):
    method test_constraint_no_project_allows_any_tasks (line 147) | def test_constraint_no_project_allows_any_tasks(self):
    method test_constraint_no_tasks_no_project (line 157) | def test_constraint_no_tasks_no_project(self):
    method test_write_adding_incompatible_task_raises (line 162) | def test_write_adding_incompatible_task_raises(self):
    method test_create_page_with_multiple_tasks_same_project (line 174) | def test_create_page_with_multiple_tasks_same_project(self):

FILE: document_page_project_task/tests/test_project_task.py
  class TestProjectTask (line 7) | class TestProjectTask(common.TransactionCase):
    method setUpClass (line 9) | def setUpClass(cls):
    method test_page_count (line 20) | def test_page_count(self):
    method test_page_count_multiple_pages (line 47) | def test_page_count_multiple_pages(self):
    method test_page_linked_to_multiple_tasks (line 74) | def test_page_linked_to_multiple_tasks(self):

FILE: document_page_reference/migrations/18.0.1.1.0/post-migration.py
  function migrate (line 10) | def migrate(env, version):

FILE: document_page_reference/models/document_page.py
  class DocumentPage (line 14) | class DocumentPage(models.Model):
    method get_formview_action (line 25) | def get_formview_action(self, access_uid=None):
    method _compute_content_parsed (line 32) | def _compute_content_parsed(self):
    method _check_reference_validity (line 37) | def _check_reference_validity(self):
    method _get_document (line 48) | def _get_document(self, code):
    method get_content (line 51) | def get_content(self):
    method _resolve_reference (line 61) | def _resolve_reference(self, code):
    method get_raw_content (line 75) | def get_raw_content(self):
    method create (line 79) | def create(self, vals_list):

FILE: document_page_reference/static/src/js/editor.esm.js
  class DocumentPageReferenceField (line 6) | class DocumentPageReferenceField extends HtmlField {
    method setup (line 7) | setup() {
    method _onClickDirectLink (line 21) | _onClickDirectLink(event) {

FILE: document_page_reference/tests/test_document_reference.py
  class TestDocumentReference (line 11) | class TestDocumentReference(BaseCommon):
    method setUpClass (line 13) | def setUpClass(cls):
    method test_constraints_duplicate_reference (line 24) | def test_constraints_duplicate_reference(self):
    method test_constraints_invalid_reference (line 29) | def test_constraints_invalid_reference(self):
    method test_no_contrains (line 34) | def test_no_contrains(self):
    method test_check_raw (line 40) | def test_check_raw(self):
    method test_auto_reference (line 43) | def test_auto_reference(self):
    method test_get_formview_action (line 60) | def test_get_formview_action(self):
    method test_compute_content_parsed (line 73) | def test_compute_content_parsed(self):

FILE: document_page_tag/models/document_page.py
  class DocumentPage (line 6) | class DocumentPage(models.Model):

FILE: document_page_tag/models/document_page_tag.py
  class DocumentPageTag (line 6) | class DocumentPageTag(models.Model):
    method create (line 19) | def create(self, vals_list):

FILE: document_page_tag/tests/test_document_page_tag.py
  class TestDocumentPageTag (line 9) | class TestDocumentPageTag(TransactionCase):
    method test_document_page_tag (line 10) | def test_document_page_tag(self):

FILE: document_url/models/ir_attachment.py
  class IrAttachment (line 7) | class IrAttachment(models.Model):
    method _compute_mimetype (line 10) | def _compute_mimetype(self, values):

FILE: document_url/static/src/js/url.esm.js
  method setup (line 12) | setup() {
  method _onAddUrl (line 16) | _onAddUrl(event) {
  method updateThreadAttachments (line 30) | async updateThreadAttachments() {
  method onClickAddAttachments (line 45) | onClickAddAttachments(ev) {
  method canDownload (line 63) | canDownload(attachment) {
  method attachmentUrl (line 68) | get attachmentUrl() {
  method onClickUnlink (line 74) | onClickUnlink(attachment) {

FILE: document_url/tests/test_document_url.py
  class TestDocumentUrl (line 8) | class TestDocumentUrl(common.TransactionCase):
    method setUp (line 9) | def setUp(self):
    method test_add_url_attachment (line 19) | def test_add_url_attachment(self):
    method test_dont_broke_default_compute_mimetype (line 33) | def test_dont_broke_default_compute_mimetype(self):

FILE: document_url/wizard/document_url.py
  class AddUrlWizard (line 9) | class AddUrlWizard(models.TransientModel):
    method action_add_url (line 16) | def action_add_url(self):
Condensed preview — 713 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,412K chars).
[
  {
    "path": ".copier-answers.yml",
    "chars": 780,
    "preview": "# Do NOT update manually; changes here will be overwritten by Copier\n_commit: v1.29\n_src_path: git+https://github.com/OC"
  },
  {
    "path": ".editorconfig",
    "chars": 558,
    "preview": "# Configuration for known file extensions\n[*.{css,js,json,less,md,py,rst,sass,scss,xml,yaml,yml}]\ncharset = utf-8\nend_of"
  },
  {
    "path": ".github/workflows/pre-commit.yml",
    "chars": 1653,
    "preview": "name: pre-commit\n\non:\n  pull_request:\n    branches:\n      - \"18.0*\"\n  push:\n    branches:\n      - \"18.0\"\n      - \"18.0-o"
  },
  {
    "path": ".github/workflows/stale.yml",
    "chars": 2751,
    "preview": "name: Mark stale issues and pull requests\n\non:\n  schedule:\n    - cron: \"0 12 * * 0\"\n\njobs:\n  stale:\n    runs-on: ubuntu-"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 2251,
    "preview": "name: tests\n\non:\n  pull_request:\n    branches:\n      - \"18.0*\"\n  push:\n    branches:\n      - \"18.0\"\n      - \"18.0-ocabot"
  },
  {
    "path": ".gitignore",
    "chars": 848,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n/.venv\n/.pytest_cache\n/.ruff_cache\n\n# C extensions\n*.so\n\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 4370,
    "preview": "exclude: |\n  (?x)\n  # NOT INSTALLABLE ADDONS\n  # END NOT INSTALLABLE ADDONS\n  # Files and folders generated by bots, to "
  },
  {
    "path": ".pylintrc",
    "chars": 3512,
    "preview": "\n\n[MASTER]\nload-plugins=pylint_odoo\nscore=n\n\n[ODOOLINT]\nreadme-template-url=\"https://github.com/OCA/maintainer-tools/blo"
  },
  {
    "path": ".pylintrc-mandatory",
    "chars": 2649,
    "preview": "\n[MASTER]\nload-plugins=pylint_odoo\nscore=n\n\n[ODOOLINT]\nreadme-template-url=\"https://github.com/OCA/maintainer-tools/blob"
  },
  {
    "path": ".ruff.toml",
    "chars": 652,
    "preview": "\ntarget-version = \"py310\"\nfix = true\n\n[lint]\nextend-select = [\n    \"B\",\n    \"C90\",\n    \"E501\",  # line too long (default"
  },
  {
    "path": "LICENSE",
    "chars": 34523,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "README.md",
    "chars": 4015,
    "preview": "\n[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=O"
  },
  {
    "path": "attachment_preview/README.rst",
    "chars": 3954,
    "preview": ".. image:: https://odoo-community.org/readme-banner-image\n   :target: https://odoo-community.org/get-involved?utm_source"
  },
  {
    "path": "attachment_preview/__init__.py",
    "chars": 132,
    "preview": "# Copyright 2014 Therp BV (<http://therp.nl>)\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nfrom . im"
  },
  {
    "path": "attachment_preview/__manifest__.py",
    "chars": 1336,
    "preview": "# Copyright 2014 Therp BV (<http://therp.nl>)\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\n{\n    \"na"
  },
  {
    "path": "attachment_preview/i18n/attachment_preview.pot",
    "chars": 962,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/de.po",
    "chars": 1588,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/es.po",
    "chars": 1953,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/i18n/gl.po",
    "chars": 1201,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/it.po",
    "chars": 1937,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/i18n/nl.po",
    "chars": 1704,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/i18n/pt_BR.po",
    "chars": 1505,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/pt_PT.po",
    "chars": 1767,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/i18n/sl.po",
    "chars": 1879,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/i18n/tr.po",
    "chars": 1598,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/vi_VN.po",
    "chars": 1592,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_preview\n#\nm"
  },
  {
    "path": "attachment_preview/i18n/zh_CN.po",
    "chars": 1723,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * attachment_preview\n#\n# "
  },
  {
    "path": "attachment_preview/models/__init__.py",
    "chars": 139,
    "preview": "# Copyright 2014 Therp BV (<http://therp.nl>)\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nfrom . im"
  },
  {
    "path": "attachment_preview/models/ir_attachment.py",
    "chars": 3611,
    "preview": "# Copyright 2014 Therp BV (<http://therp.nl>)\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nimport co"
  },
  {
    "path": "attachment_preview/pyproject.toml",
    "chars": 69,
    "preview": "[build-system]\nrequires = [\"whool\"]\nbuild-backend = \"whool.buildapi\"\n"
  },
  {
    "path": "attachment_preview/readme/CONTRIBUTORS.md",
    "chars": 91,
    "preview": "- Holger Brunn \\<<mail@hunki-enterprises.com>\\>\n- Dennis Sluijk \\<<d.sluijk@onestein.nl>\\>\n"
  },
  {
    "path": "attachment_preview/readme/DESCRIPTION.md",
    "chars": 224,
    "preview": "This addon allows to preview attachments supported by\n<http://viewerjs.org>.\n\nCurrently, that's most Libreoffice files a"
  },
  {
    "path": "attachment_preview/readme/INSTALL.md",
    "chars": 119,
    "preview": "For filetype recognition, you'll get the best results by installing\n`python-magic`:\n\nsudo apt-get install python-magic\n"
  },
  {
    "path": "attachment_preview/readme/USAGE.md",
    "chars": 465,
    "preview": "The module adds a little print preview icon right of download links for\nattachments or binary fields. When a preview is "
  },
  {
    "path": "attachment_preview/static/description/index.html",
    "chars": 13881,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/compatibility.js",
    "chars": 17788,
    "preview": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 auto"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/example.local.css",
    "chars": 1081,
    "preview": "/* This is just a sample file with CSS rules. You should write your own @font-face declarations\n * to add support for yo"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/index.html",
    "chars": 42024,
    "preview": "<!DOCTYPE html>\n<html dir=\"ltr\" lang=\"en-US\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; cha"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/pdf.js",
    "chars": 261784,
    "preview": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 auto"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/pdf.worker.js",
    "chars": 1250572,
    "preview": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* vim: set shiftwidth=2 tabstop=2 auto"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/pdfjsversion.js",
    "chars": 52,
    "preview": "var /**@const{!string}*/pdfjs_version = \"v1.1.114\";\n"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/text_layer_builder.js",
    "chars": 13893,
    "preview": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* Copyright 2012 Mozilla Foundation\n *"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/ui_utils.js",
    "chars": 11903,
    "preview": "/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */\n/* Copyright 2012 Mozilla Foundation\n *"
  },
  {
    "path": "attachment_preview/static/lib/ViewerJS/webodf.js",
    "chars": 437795,
    "preview": "/*\n\n This is a generated file. DO NOT EDIT.\n\n Copyright (C) 2010-2015 KO GmbH <copyright@kogmbh.com>\n\n @licstart\n The co"
  },
  {
    "path": "attachment_preview/static/src/js/attachmentPreviewWidget.esm.js",
    "chars": 2986,
    "preview": "import {Component, onWillStart, useRef, useState} from \"@odoo/owl\";\nimport {ensureJQuery} from \"@web/core/ensure_jquery\""
  },
  {
    "path": "attachment_preview/static/src/js/mail_core/attachment_list.esm.js",
    "chars": 734,
    "preview": "import {canPreview, showPreview} from \"../utils.esm\";\nimport {AttachmentList} from \"@mail/core/common/attachment_list\";\n"
  },
  {
    "path": "attachment_preview/static/src/js/utils.esm.js",
    "chars": 2321,
    "preview": "import {Component} from \"@odoo/owl\";\n\nexport function canPreview(extension) {\n    const supported_extensions = [\n       "
  },
  {
    "path": "attachment_preview/static/src/js/viewerjs_tweaks.js",
    "chars": 613,
    "preview": "/* Copyright 2014 Therp BV (<http://therp.nl>)\n * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */\n\n// "
  },
  {
    "path": "attachment_preview/static/src/js/web_views/fields/binary_field.esm.js",
    "chars": 2204,
    "preview": "import {canPreview, showPreview} from \"../../utils.esm\";\nimport {BinaryField} from \"@web/views/fields/binary/binary_fiel"
  },
  {
    "path": "attachment_preview/static/src/js/web_views/form/form_compiler.esm.js",
    "chars": 808,
    "preview": "import {append, createElement, setAttributes} from \"@web/core/utils/xml\";\nimport {FormCompiler} from \"@web/views/form/fo"
  },
  {
    "path": "attachment_preview/static/src/js/web_views/form/form_controller.esm.js",
    "chars": 504,
    "preview": "import {FormController} from \"@web/views/form/form_controller\";\nimport {patch} from \"@web/core/utils/patch\";\n\npatch(Form"
  },
  {
    "path": "attachment_preview/static/src/js/web_views/form/form_renderer.esm.js",
    "chars": 377,
    "preview": "import {AttachmentPreviewWidget} from \"../../attachmentPreviewWidget.esm\";\nimport {FormRenderer} from \"@web/views/form/f"
  },
  {
    "path": "attachment_preview/static/src/scss/attachment_preview.scss",
    "chars": 651,
    "preview": ".attachment_preview_buttons {\n    padding: 4px;\n    float: left;\n    width: 100%;\n    background-color: #fff;\n    border"
  },
  {
    "path": "attachment_preview/static/src/xml/attachment_preview.xml",
    "chars": 3653,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<templates>\n    <t t-name=\"Attachment\" t-inherit=\"mail.AttachmentList\" t-inherit"
  },
  {
    "path": "attachment_preview/tests/__init__.py",
    "chars": 129,
    "preview": "# Copyright 2018 Onestein\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nfrom . import test_attachment"
  },
  {
    "path": "attachment_preview/tests/test_attachment_preview.py",
    "chars": 2267,
    "preview": "# Copyright 2018 Onestein\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nimport base64\n\nfrom odoo.addo"
  },
  {
    "path": "attachment_zipped_download/README.rst",
    "chars": 6111,
    "preview": "==========================\nAttachment Zipped Download\n==========================\n\n.. \n   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
  },
  {
    "path": "attachment_zipped_download/__init__.py",
    "chars": 47,
    "preview": "from . import controllers\nfrom . import models\n"
  },
  {
    "path": "attachment_zipped_download/__manifest__.py",
    "chars": 458,
    "preview": "# Copyright 2022 Tecnativa - Víctor Martínez\n# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).\n{\n    \"nam"
  },
  {
    "path": "attachment_zipped_download/controllers/__init__.py",
    "chars": 19,
    "preview": "from . import main\n"
  },
  {
    "path": "attachment_zipped_download/controllers/main.py",
    "chars": 886,
    "preview": "# Copyright 2019 César Fernández Domínguez <cesfernandez@outlook.com>\n# Copyright 2022 Tecnativa - Víctor Martínez\n# Lic"
  },
  {
    "path": "attachment_zipped_download/i18n/attachment_zipped_download.pot",
    "chars": 1606,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/es.po",
    "chars": 2091,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/fr.po",
    "chars": 1909,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/gl.po",
    "chars": 2037,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/hr.po",
    "chars": 1919,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/it.po",
    "chars": 2004,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/pt.po",
    "chars": 1996,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/i18n/pt_BR.po",
    "chars": 1678,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* attachment_zipped_down"
  },
  {
    "path": "attachment_zipped_download/models/__init__.py",
    "chars": 72,
    "preview": "from . import ir_attachment\nfrom . import ir_attachment_action_download\n"
  },
  {
    "path": "attachment_zipped_download/models/ir_attachment.py",
    "chars": 1445,
    "preview": "# Copyright 2019 César Fernández Domínguez <cesfernandez@outlook.com>\n# Copyright 2022 Tecnativa - Víctor Martínez\n# Lic"
  },
  {
    "path": "attachment_zipped_download/models/ir_attachment_action_download.py",
    "chars": 2036,
    "preview": "# Copyright 2023 Foodles (https://www.foodles.com/)\n# @author Pierre Verkest <pierreverkest84@gmail.com>\n# License AGPL-"
  },
  {
    "path": "attachment_zipped_download/pyproject.toml",
    "chars": 69,
    "preview": "[build-system]\nrequires = [\"whool\"]\nbuild-backend = \"whool.buildapi\"\n"
  },
  {
    "path": "attachment_zipped_download/readme/CONTRIBUTORS.md",
    "chars": 187,
    "preview": "- César Fernández Domínguez \\<<cesfernandez@outlook.com>\\>\n- [Tecnativa](https://www.tecnativa.com):\n  - Víctor Martínez"
  },
  {
    "path": "attachment_zipped_download/readme/DESCRIPTION.md",
    "chars": 189,
    "preview": "This module allows downloading multiple attachments as a zip file.\n\nThis also provide a helper class IrAttachmentActionD"
  },
  {
    "path": "attachment_zipped_download/readme/USAGE.md",
    "chars": 2995,
    "preview": "1.  Go to *Settings \\> Technical \\> Database Structure \\> Attachments*\n    and select some files.\n2.  Go to *Actions \\> "
  },
  {
    "path": "attachment_zipped_download/static/description/index.html",
    "chars": 16310,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "attachment_zipped_download/tests/__init__.py",
    "chars": 160,
    "preview": "# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)\n\nfrom . import test_attachment_zipped_download\nfrom . im"
  },
  {
    "path": "attachment_zipped_download/tests/models/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "attachment_zipped_download/tests/models/res_partner.py",
    "chars": 322,
    "preview": "# Copyright 2023 Foodles (https://www.foodles.com/)\n# @author Pierre Verkest <pierreverkest84@gmail.com>\n# License AGPL-"
  },
  {
    "path": "attachment_zipped_download/tests/test_attachment_zipped_download.py",
    "chars": 2555,
    "preview": "# Copyright 2022-2024 Tecnativa - Víctor Martínez\n# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).\nimpor"
  },
  {
    "path": "attachment_zipped_download/tests/test_ir_attachment_action_download.py",
    "chars": 3256,
    "preview": "# Copyright 2023 Foodles (https://www.foodles.com/)\n# @author Pierre Verkest <pierreverkest84@gmail.com>\n# License AGPL-"
  },
  {
    "path": "attachment_zipped_download/views/ir_attachment_view.xml",
    "chars": 496,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record id=\"action_attachments_download\" model=\"ir.actions.server\">\n "
  },
  {
    "path": "checklog-odoo.cfg",
    "chars": 63,
    "preview": "[checklog-odoo]\nignore=\n    WARNING.* 0 failed, 0 error\\(s\\).*\n"
  },
  {
    "path": "document_knowledge/README.rst",
    "chars": 4743,
    "preview": ".. image:: https://odoo-community.org/readme-banner-image\n   :target: https://odoo-community.org/get-involved?utm_source"
  },
  {
    "path": "document_knowledge/__init__.py",
    "chars": 142,
    "preview": "# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_knowledge/__manifest__.py",
    "chars": 753,
    "preview": "# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_knowledge/data/ir_module_category.xml",
    "chars": 352,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record model=\"ir.module.category\" id=\"module_category_knowledge\">\n  "
  },
  {
    "path": "document_knowledge/data/res_users.xml",
    "chars": 247,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record id=\"base.user_admin\" model=\"res.users\">\n        <field\n      "
  },
  {
    "path": "document_knowledge/demo/document_knowledge.xml",
    "chars": 259,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo noupdate=\"1\">\n    <record id=\"base.user_demo\" model=\"res.users\">\n        <"
  },
  {
    "path": "document_knowledge/i18n/am.po",
    "chars": 3917,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ar.po",
    "chars": 4163,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/bg.po",
    "chars": 4013,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/bs.po",
    "chars": 3954,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ca.po",
    "chars": 5630,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/cs.po",
    "chars": 4126,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/da.po",
    "chars": 4017,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/de.po",
    "chars": 6280,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/document_knowledge.pot",
    "chars": 3288,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* document_knowledge\n#\nm"
  },
  {
    "path": "document_knowledge/i18n/el.po",
    "chars": 4040,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/el_GR.po",
    "chars": 3825,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/en_AU.po",
    "chars": 3662,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/en_GB.po",
    "chars": 4034,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es.po",
    "chars": 6077,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_AR.po",
    "chars": 4182,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_CL.po",
    "chars": 3629,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_CO.po",
    "chars": 3767,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_CR.po",
    "chars": 4057,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_DO.po",
    "chars": 3854,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_EC.po",
    "chars": 3859,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_ES.po",
    "chars": 3844,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_MX.po",
    "chars": 4053,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_PY.po",
    "chars": 3735,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/es_VE.po",
    "chars": 3989,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/et.po",
    "chars": 3787,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/eu.po",
    "chars": 3691,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/fa.po",
    "chars": 3993,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/fi.po",
    "chars": 4242,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/fr.po",
    "chars": 7005,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/fr_CA.po",
    "chars": 3917,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/gl.po",
    "chars": 4489,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/gu.po",
    "chars": 3707,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/he.po",
    "chars": 3988,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/he_IL.po",
    "chars": 4843,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* knowledge\n#\nmsgid \"\"\nm"
  },
  {
    "path": "document_knowledge/i18n/hi.po",
    "chars": 3681,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/hr.po",
    "chars": 4158,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/hu.po",
    "chars": 4142,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/hy.po",
    "chars": 3657,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/id.po",
    "chars": 3962,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/is.po",
    "chars": 3647,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/it.po",
    "chars": 5941,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ja.po",
    "chars": 3916,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ka.po",
    "chars": 3691,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/kab.po",
    "chars": 4084,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/kk.po",
    "chars": 3594,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/knowledge.pot",
    "chars": 5188,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* knowledge\n#\nmsgid \"\"\nm"
  },
  {
    "path": "document_knowledge/i18n/ko.po",
    "chars": 3982,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ln.po",
    "chars": 3605,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/lo.po",
    "chars": 3743,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/lt.po",
    "chars": 3996,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/lv.po",
    "chars": 4026,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/mk.po",
    "chars": 4158,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/mn.po",
    "chars": 4133,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/nb.po",
    "chars": 4024,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/nl.po",
    "chars": 4126,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/nl_BE.po",
    "chars": 4025,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/nl_NL.po",
    "chars": 3912,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/pl.po",
    "chars": 4205,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/pt.po",
    "chars": 4141,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/pt_BR.po",
    "chars": 6290,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/pt_PT.po",
    "chars": 3862,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ro.po",
    "chars": 4195,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/ru.po",
    "chars": 6811,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/sk.po",
    "chars": 3974,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/sl.po",
    "chars": 6079,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/sr.po",
    "chars": 3852,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/sr@latin.po",
    "chars": 3909,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/sv.po",
    "chars": 5745,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/th.po",
    "chars": 3994,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/tr.po",
    "chars": 5898,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/uk.po",
    "chars": 4007,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/vi.po",
    "chars": 3743,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/zh_CN.po",
    "chars": 3982,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/i18n/zh_TW.po",
    "chars": 3796,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * knowledge\n#\n# Translato"
  },
  {
    "path": "document_knowledge/models/__init__.py",
    "chars": 174,
    "preview": "# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_knowledge/models/ir_attachment.py",
    "chars": 335,
    "preview": "# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_knowledge/models/res_config.py",
    "chars": 423,
    "preview": "# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_knowledge/pyproject.toml",
    "chars": 69,
    "preview": "[build-system]\nrequires = [\"whool\"]\nbuild-backend = \"whool.buildapi\"\n"
  },
  {
    "path": "document_knowledge/readme/CONFIGURE.md",
    "chars": 819,
    "preview": "To set up this module, you need to go to:\n\n- Knowledge / Configuration / Settings\n\nFrom this menu you'll have a central "
  },
  {
    "path": "document_knowledge/readme/CONTRIBUTORS.md",
    "chars": 577,
    "preview": "- Odoo SA \\<<info@odoo.com>\\>\n- Savoir-faire Linux \\<<support@savoirfairelinux.com>\\>\n- Gervais Naoussi \\<<gervaisnaouss"
  },
  {
    "path": "document_knowledge/readme/CREDITS.md",
    "chars": 91,
    "preview": "The migration of this module from 17.0 to 18.0 was financially supported by:\n\n- Camptocamp\n"
  },
  {
    "path": "document_knowledge/readme/DESCRIPTION.md",
    "chars": 79,
    "preview": "This module is the base for any knowledge and document management\napplication.\n"
  },
  {
    "path": "document_knowledge/readme/USAGE.md",
    "chars": 230,
    "preview": "This module adds a new top level menu *Knowledge*\n\nUsers with permission *Central access to Documents* can access in\n*Kn"
  },
  {
    "path": "document_knowledge/security/document_knowledge_security.xml",
    "chars": 683,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record id=\"group_document_user\" model=\"res.groups\">\n        <field n"
  },
  {
    "path": "document_knowledge/static/description/index.html",
    "chars": 15852,
    "preview": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
  },
  {
    "path": "document_knowledge/views/document_knowledge.xml",
    "chars": 2009,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record id=\"knowledge_action_documents\" model=\"ir.actions.act_window\""
  },
  {
    "path": "document_knowledge/views/res_config.xml",
    "chars": 2184,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<odoo>\n    <record id=\"view_knowledge_configuration\" model=\"ir.ui.view\">\n       "
  },
  {
    "path": "document_page/README.rst",
    "chars": 4235,
    "preview": ".. image:: https://odoo-community.org/readme-banner-image\n   :target: https://odoo-community.org/get-involved?utm_source"
  },
  {
    "path": "document_page/__init__.py",
    "chars": 107,
    "preview": "# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n\nfrom . import models\nfrom . import wizard\n"
  },
  {
    "path": "document_page/__manifest__.py",
    "chars": 1481,
    "preview": "# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).\n# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).\n"
  },
  {
    "path": "document_page/demo/document_page.xml",
    "chars": 6810,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<odoo noupdate=\"1\">\n    <record id=\"base.user_demo\" model=\"res.users\">\n        <"
  },
  {
    "path": "document_page/i18n/am.po",
    "chars": 20459,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/ar.po",
    "chars": 20616,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/bg.po",
    "chars": 20549,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/bs.po",
    "chars": 20488,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/ca.po",
    "chars": 22572,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/cs.po",
    "chars": 20563,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/da.po",
    "chars": 20549,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/de.po",
    "chars": 21314,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/document_page.pot",
    "chars": 20083,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# \t* document_page\n#\nmsgid "
  },
  {
    "path": "document_page/i18n/el.po",
    "chars": 20569,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/el_GR.po",
    "chars": 20491,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/en_AU.po",
    "chars": 20330,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/en_GB.po",
    "chars": 20558,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es.po",
    "chars": 23236,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es_AR.po",
    "chars": 20703,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es_CL.po",
    "chars": 20326,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es_CO.po",
    "chars": 20422,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es_CR.po",
    "chars": 20694,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  },
  {
    "path": "document_page/i18n/es_DO.po",
    "chars": 20359,
    "preview": "# Translation of Odoo Server.\n# This file contains the translation of the following modules:\n# * document_page\n#\n# Trans"
  }
]

// ... and 513 more files (download for full content)

About this extraction

This page contains the full source code of the OCA/knowledge GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 713 files (5.8 MB), approximately 1.5M tokens, and a symbol index with 1392 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!