From f35a7b0e70032de2feec9f3bda09da44cf0e1073 Mon Sep 17 00:00:00 2001 From: srv Date: Mon, 28 Apr 2025 17:11:28 -0500 Subject: first commit --- .drone.yml | 17 + .gitignore | 27 + .gitlab-ci.yml | 18 + LICENSE | 662 + Makefile.example | 106 + README.md | 254 + .../emacsen-000-de-luis-saravia-para-sus-hijos.md | 22 + content/heckyel_pub.asc | 422 + content/pages/404.md | 7 + content/pages/acerca-de.eo.md | 19 + content/pages/acerca-de.md | 22 + content/pages/apoyo-economico.en.md | 18 + content/pages/apoyo-economico.eo.md | 15 + content/pages/apoyo-economico.md | 19 + content/pages/buscar.php.md | 195 + content/pages/contacto.de.md | 14 + content/pages/contacto.en.md | 13 + content/pages/contacto.eo.md | 12 + content/pages/contacto.md | 13 + content/pages/donaciones.de.md | 21 + content/pages/donaciones.en.md | 21 + content/pages/donaciones.eo.md | 21 + content/pages/donaciones.fr.md | 21 + content/pages/donaciones.md | 21 + content/pages/estructura-de-directorios.md | 80 + content/pages/libreJS.md | 34 + "content/pages/pol\303\255tica-de-uso.eo.md" | 56 + "content/pages/pol\303\255tica-de-uso.md" | 63 + content/robots.txt | 3 + .../emacsen-000-de-luis-saravia-para-sus-hijos.png | Bin 0 -> 80175 bytes .../emacsen-000-de-luis-saravia-para-sus-hijos.png | Bin 0 -> 80175 bytes .../emacsen-000-de-luis-saravia-para-sus-hijos.mp4 | Bin 0 -> 5460143 bytes .../videos/emacsen-001-reporte-y-como-empece.mp4 | Bin 0 -> 22015750 bytes .../uploads/article/videos/emacsen-001-reporte.mp4 | Bin 0 -> 63385526 bytes .../videos/emacsen-002-como-empece-detalles.mp4 | Bin 0 -> 26611603 bytes .../article/videos/emacsen-002-eLisp-tipo-bash.mp4 | Bin 0 -> 39283712 bytes .../article/videos/emacsen-003-touchpad.mp4 | Bin 0 -> 13661728 bytes .../videos/emacsen-006-bloques-de-tiempo.mp4 | Bin 0 -> 5178986 bytes .../uploads/pages/images/2017/03/poster.png | Bin 0 -> 139464 bytes content/wp-content/uploads/pages/images/donaci.svg | 1 + content/wp-content/uploads/pages/images/donar.svg | 1 + content/wp-content/uploads/pages/images/donate.svg | 1 + .../uploads/pages/subtitles/2017/03/english.vtt | 1209 ++ .../uploads/pages/subtitles/2017/03/portuguese.vtt | 1103 ++ .../uploads/pages/subtitles/2017/03/spanish.vtt | 1130 ++ emacsen-001-reporte-y-como-empece.md | 0 emacsen-001-reporte.md | 0 emacsen-002-como-empece-detalles.md | 0 emacsen-002-eLisp-tipo-bash.md | 0 emacsen-003-touchpad.md | 0 emacsen-006-bloques-de-tiempo.md | 0 libretube-theme/babel.cfg | 1 + libretube-theme/messages.pot | 254 + libretube-theme/static/css/bootstrap/bootstrap.css | 6000 +++++++ libretube-theme/static/css/styles.css | 851 + libretube-theme/static/fonts/opensans/latin.woff2 | Bin 0 -> 14380 bytes .../static/images/favicon/favicon-16x16.png | Bin 0 -> 463 bytes .../static/images/favicon/favicon-192x192.png | Bin 0 -> 2866 bytes .../static/images/favicon/favicon-32x32.png | Bin 0 -> 925 bytes .../static/images/favicon/favicon-96x96.png | Bin 0 -> 1749 bytes libretube-theme/static/images/logo.svg | 62 + libretube-theme/static/images/profile.png | Bin 0 -> 12603 bytes libretube-theme/static/images/search.png | Bin 0 -> 715 bytes libretube-theme/static/images/svg/master.svg | 120 + libretube-theme/static/images/video.png | Bin 0 -> 4735 bytes libretube-theme/static/images/videocamera.svg | 19 + libretube-theme/static/js/play.js | 21 + libretube-theme/static/modules/plyr/blank.webm | Bin 0 -> 594 bytes libretube-theme/static/modules/plyr/plyr.css | 1 + libretube-theme/static/modules/plyr/plyr.js | 9320 +++++++++++ libretube-theme/static/modules/plyr/plyr.min.js | 4 + .../static/modules/plyr/plyr.min.js.map | 1 + libretube-theme/static/modules/plyr/plyr.min.mjs | 3 + .../static/modules/plyr/plyr.min.mjs.map | 1 + libretube-theme/static/modules/plyr/plyr.mjs | 9312 +++++++++++ .../static/modules/plyr/plyr.polyfilled.js | 15761 +++++++++++++++++++ .../static/modules/plyr/plyr.polyfilled.min.js | 4 + .../static/modules/plyr/plyr.polyfilled.min.js.map | 1 + .../static/modules/plyr/plyr.polyfilled.min.mjs | 3 + .../modules/plyr/plyr.polyfilled.min.mjs.map | 1 + .../static/modules/plyr/plyr.polyfilled.mjs | 15753 ++++++++++++++++++ libretube-theme/static/modules/plyr/plyr.svg | 1 + libretube-theme/templates/archives.html | 99 + libretube-theme/templates/article.html | 270 + libretube-theme/templates/article_info.html | 68 + libretube-theme/templates/article_info_aside.html | 54 + libretube-theme/templates/author.html | 34 + libretube-theme/templates/authors.html | 72 + libretube-theme/templates/base.html | 203 + libretube-theme/templates/categories.html | 40 + libretube-theme/templates/category.html | 17 + libretube-theme/templates/index.html | 37 + libretube-theme/templates/page.html | 49 + libretube-theme/templates/pagination.html | 78 + libretube-theme/templates/period_archives.html | 55 + libretube-theme/templates/tag.html | 14 + libretube-theme/templates/tags.html | 35 + libretube-theme/templates/translations.html | 16 + .../translations/de/LC_MESSAGES/messages.po | 258 + .../translations/en/LC_MESSAGES/messages.po | 257 + .../translations/eo/LC_MESSAGES/messages.po | 260 + .../translations/fr/LC_MESSAGES/messages.po | 258 + new.sh | 44 + pelicanconf.py | 248 + plugins/another_read_more_link/.gitignore | 89 + plugins/another_read_more_link/LICENSE | 201 + plugins/another_read_more_link/Readme.md | 33 + plugins/another_read_more_link/__init__.py | 1 + .../another_read_more_link.py | 72 + plugins/compressor/LICENSE | 661 + plugins/compressor/README.md | 10 + plugins/compressor/__init__.py | 2 + plugins/compressor/compressor.py | 40 + plugins/compressor/css_minifer.py | 316 + plugins/compressor/js_minifer.py | 171 + plugins/compressor/minify.py | 266 + plugins/compressor/variables.py | 211 + plugins/get_app_version/LICENSE | 674 + plugins/get_app_version/README.md | 24 + plugins/get_app_version/__init__.py | 1 + plugins/get_app_version/get_app_version.py | 41 + plugins/i18n_subsites/README.rst | 165 + plugins/i18n_subsites/__init__.py | 1 + plugins/i18n_subsites/i18n_subsites.py | 469 + .../implementing_language_buttons.rst | 128 + plugins/i18n_subsites/localizing_using_jinja2.rst | 200 + .../i18n_subsites/test_data/content/images/img.png | 0 .../test_data/content/pages/hidden-page-cz.rst | 7 + .../test_data/content/pages/hidden-page-de.rst | 7 + .../test_data/content/pages/hidden-page-en.rst | 7 + .../test_data/content/pages/untranslated-page.rst | 5 + .../test_data/content/translated_article-cz.rst | 8 + .../test_data/content/translated_article-de.rst | 8 + .../test_data/content/translated_article-en.rst | 8 + .../test_data/content/untranslated_article-en.rst | 9 + .../test_data/localized_theme/babel.cfg | 2 + .../test_data/localized_theme/messages.pot | 23 + .../test_data/localized_theme/static/style.css | 0 .../test_data/localized_theme/templates/base.html | 7 + .../translations/de/LC_MESSAGES/messages.po | 23 + plugins/i18n_subsites/test_data/pelicanconf.py | 53 + plugins/i18n_subsites/test_i18n_subsites.py | 139 + plugins/neighbors/LICENSE | 674 + plugins/neighbors/Readme.rst | 97 + plugins/neighbors/__init__.py | 1 + plugins/neighbors/neighbors.py | 59 + plugins/pelican-css-js/LICENSE | 674 + plugins/pelican-css-js/README.md | 87 + plugins/pelican-css-js/__init__.py | 1 + plugins/pelican-css-js/pelican_css_js.py | 87 + plugins/sitemap/LICENSE | 661 + plugins/sitemap/README.md | 3 + plugins/sitemap/__init__.py | 1 + plugins/sitemap/sitemap.py | 271 + plugins/tag-cloud/LICENSE | 661 + plugins/tag-cloud/README.md | 3 + plugins/tag-cloud/__init__.py | 1 + plugins/tag-cloud/tag_cloud.py | 89 + plugins/tipue-search/LICENSE | 661 + plugins/tipue-search/README.md | 98 + plugins/tipue-search/__init__.py | 1 + plugins/tipue-search/tipue_search.py | 212 + publishconf.py | 23 + requirements.txt | 18 + scripts/vendor.sh | 31 + 165 files changed, 74117 insertions(+) create mode 100644 .drone.yml create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 LICENSE create mode 100644 Makefile.example create mode 100644 README.md create mode 100644 content/articles/emacsen-000-de-luis-saravia-para-sus-hijos.md create mode 100644 content/heckyel_pub.asc create mode 100644 content/pages/404.md create mode 100644 content/pages/acerca-de.eo.md create mode 100644 content/pages/acerca-de.md create mode 100644 content/pages/apoyo-economico.en.md create mode 100644 content/pages/apoyo-economico.eo.md create mode 100644 content/pages/apoyo-economico.md create mode 100644 content/pages/buscar.php.md create mode 100644 content/pages/contacto.de.md create mode 100644 content/pages/contacto.en.md create mode 100644 content/pages/contacto.eo.md create mode 100644 content/pages/contacto.md create mode 100644 content/pages/donaciones.de.md create mode 100644 content/pages/donaciones.en.md create mode 100644 content/pages/donaciones.eo.md create mode 100644 content/pages/donaciones.fr.md create mode 100644 content/pages/donaciones.md create mode 100644 content/pages/estructura-de-directorios.md create mode 100644 content/pages/libreJS.md create mode 100644 "content/pages/pol\303\255tica-de-uso.eo.md" create mode 100644 "content/pages/pol\303\255tica-de-uso.md" create mode 100644 content/robots.txt create mode 100644 content/wp-content/uploads/article/images/emacsen-000-de-luis-saravia-para-sus-hijos.png create mode 100644 content/wp-content/uploads/article/thumbnail/emacsen-000-de-luis-saravia-para-sus-hijos.png create mode 100644 content/wp-content/uploads/article/videos/emacsen-000-de-luis-saravia-para-sus-hijos.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-001-reporte-y-como-empece.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-001-reporte.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-002-como-empece-detalles.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-002-eLisp-tipo-bash.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-003-touchpad.mp4 create mode 100644 content/wp-content/uploads/article/videos/emacsen-006-bloques-de-tiempo.mp4 create mode 100644 content/wp-content/uploads/pages/images/2017/03/poster.png create mode 100644 content/wp-content/uploads/pages/images/donaci.svg create mode 100644 content/wp-content/uploads/pages/images/donar.svg create mode 100644 content/wp-content/uploads/pages/images/donate.svg create mode 100644 content/wp-content/uploads/pages/subtitles/2017/03/english.vtt create mode 100644 content/wp-content/uploads/pages/subtitles/2017/03/portuguese.vtt create mode 100644 content/wp-content/uploads/pages/subtitles/2017/03/spanish.vtt create mode 100644 emacsen-001-reporte-y-como-empece.md create mode 100644 emacsen-001-reporte.md create mode 100644 emacsen-002-como-empece-detalles.md create mode 100644 emacsen-002-eLisp-tipo-bash.md create mode 100644 emacsen-003-touchpad.md create mode 100644 emacsen-006-bloques-de-tiempo.md create mode 100644 libretube-theme/babel.cfg create mode 100644 libretube-theme/messages.pot create mode 100644 libretube-theme/static/css/bootstrap/bootstrap.css create mode 100644 libretube-theme/static/css/styles.css create mode 100644 libretube-theme/static/fonts/opensans/latin.woff2 create mode 100644 libretube-theme/static/images/favicon/favicon-16x16.png create mode 100644 libretube-theme/static/images/favicon/favicon-192x192.png create mode 100644 libretube-theme/static/images/favicon/favicon-32x32.png create mode 100644 libretube-theme/static/images/favicon/favicon-96x96.png create mode 100644 libretube-theme/static/images/logo.svg create mode 100644 libretube-theme/static/images/profile.png create mode 100644 libretube-theme/static/images/search.png create mode 100644 libretube-theme/static/images/svg/master.svg create mode 100644 libretube-theme/static/images/video.png create mode 100644 libretube-theme/static/images/videocamera.svg create mode 100644 libretube-theme/static/js/play.js create mode 100644 libretube-theme/static/modules/plyr/blank.webm create mode 100644 libretube-theme/static/modules/plyr/plyr.css create mode 100644 libretube-theme/static/modules/plyr/plyr.js create mode 100644 libretube-theme/static/modules/plyr/plyr.min.js create mode 100644 libretube-theme/static/modules/plyr/plyr.min.js.map create mode 100644 libretube-theme/static/modules/plyr/plyr.min.mjs create mode 100644 libretube-theme/static/modules/plyr/plyr.min.mjs.map create mode 100644 libretube-theme/static/modules/plyr/plyr.mjs create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.js create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.min.js create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.min.js.map create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.min.mjs.map create mode 100644 libretube-theme/static/modules/plyr/plyr.polyfilled.mjs create mode 100644 libretube-theme/static/modules/plyr/plyr.svg create mode 100644 libretube-theme/templates/archives.html create mode 100644 libretube-theme/templates/article.html create mode 100644 libretube-theme/templates/article_info.html create mode 100644 libretube-theme/templates/article_info_aside.html create mode 100644 libretube-theme/templates/author.html create mode 100644 libretube-theme/templates/authors.html create mode 100644 libretube-theme/templates/base.html create mode 100644 libretube-theme/templates/categories.html create mode 100644 libretube-theme/templates/category.html create mode 100644 libretube-theme/templates/index.html create mode 100644 libretube-theme/templates/page.html create mode 100644 libretube-theme/templates/pagination.html create mode 100644 libretube-theme/templates/period_archives.html create mode 100644 libretube-theme/templates/tag.html create mode 100644 libretube-theme/templates/tags.html create mode 100644 libretube-theme/templates/translations.html create mode 100644 libretube-theme/translations/de/LC_MESSAGES/messages.po create mode 100644 libretube-theme/translations/en/LC_MESSAGES/messages.po create mode 100644 libretube-theme/translations/eo/LC_MESSAGES/messages.po create mode 100644 libretube-theme/translations/fr/LC_MESSAGES/messages.po create mode 100644 new.sh create mode 100644 pelicanconf.py create mode 100644 plugins/another_read_more_link/.gitignore create mode 100644 plugins/another_read_more_link/LICENSE create mode 100644 plugins/another_read_more_link/Readme.md create mode 100644 plugins/another_read_more_link/__init__.py create mode 100644 plugins/another_read_more_link/another_read_more_link.py create mode 100644 plugins/compressor/LICENSE create mode 100644 plugins/compressor/README.md create mode 100644 plugins/compressor/__init__.py create mode 100644 plugins/compressor/compressor.py create mode 100644 plugins/compressor/css_minifer.py create mode 100644 plugins/compressor/js_minifer.py create mode 100644 plugins/compressor/minify.py create mode 100644 plugins/compressor/variables.py create mode 100644 plugins/get_app_version/LICENSE create mode 100644 plugins/get_app_version/README.md create mode 100644 plugins/get_app_version/__init__.py create mode 100644 plugins/get_app_version/get_app_version.py create mode 100644 plugins/i18n_subsites/README.rst create mode 100644 plugins/i18n_subsites/__init__.py create mode 100644 plugins/i18n_subsites/i18n_subsites.py create mode 100644 plugins/i18n_subsites/implementing_language_buttons.rst create mode 100644 plugins/i18n_subsites/localizing_using_jinja2.rst create mode 100644 plugins/i18n_subsites/test_data/content/images/img.png create mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-cz.rst create mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-de.rst create mode 100644 plugins/i18n_subsites/test_data/content/pages/hidden-page-en.rst create mode 100644 plugins/i18n_subsites/test_data/content/pages/untranslated-page.rst create mode 100644 plugins/i18n_subsites/test_data/content/translated_article-cz.rst create mode 100644 plugins/i18n_subsites/test_data/content/translated_article-de.rst create mode 100644 plugins/i18n_subsites/test_data/content/translated_article-en.rst create mode 100644 plugins/i18n_subsites/test_data/content/untranslated_article-en.rst create mode 100644 plugins/i18n_subsites/test_data/localized_theme/babel.cfg create mode 100644 plugins/i18n_subsites/test_data/localized_theme/messages.pot create mode 100644 plugins/i18n_subsites/test_data/localized_theme/static/style.css create mode 100644 plugins/i18n_subsites/test_data/localized_theme/templates/base.html create mode 100644 plugins/i18n_subsites/test_data/localized_theme/translations/de/LC_MESSAGES/messages.po create mode 100644 plugins/i18n_subsites/test_data/pelicanconf.py create mode 100644 plugins/i18n_subsites/test_i18n_subsites.py create mode 100644 plugins/neighbors/LICENSE create mode 100644 plugins/neighbors/Readme.rst create mode 100644 plugins/neighbors/__init__.py create mode 100644 plugins/neighbors/neighbors.py create mode 100644 plugins/pelican-css-js/LICENSE create mode 100644 plugins/pelican-css-js/README.md create mode 100644 plugins/pelican-css-js/__init__.py create mode 100644 plugins/pelican-css-js/pelican_css_js.py create mode 100644 plugins/sitemap/LICENSE create mode 100644 plugins/sitemap/README.md create mode 100644 plugins/sitemap/__init__.py create mode 100644 plugins/sitemap/sitemap.py create mode 100644 plugins/tag-cloud/LICENSE create mode 100644 plugins/tag-cloud/README.md create mode 100644 plugins/tag-cloud/__init__.py create mode 100644 plugins/tag-cloud/tag_cloud.py create mode 100644 plugins/tipue-search/LICENSE create mode 100644 plugins/tipue-search/README.md create mode 100644 plugins/tipue-search/__init__.py create mode 100644 plugins/tipue-search/tipue_search.py create mode 100644 publishconf.py create mode 100644 requirements.txt create mode 100644 scripts/vendor.sh diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 0000000..4a61382 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,17 @@ +kind: pipeline +name: default + +steps: +- name: alpine + image: alpine:3.15.0 + commands: + - export SHELL=/bin/bash # hack custom shell + - apk update + - apk add musl-locales openjdk11 make py3-virtualenv + - export LANG=es_ES.UTF-8 LANGUAGE=es_ES + - virtualenv -p python3 venv + - source venv/bin/activate + - pip install -r requirements.txt + - (cd libretube-theme/ && make compile) + - cp -v Makefile.example Makefile + - make validate diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e285ffb --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +# ---> Python +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# Compiled translation catalogs +*.mo + +# Pelican +output/ + +# Makefile +Makefile + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +local.env/ + +# Node.js +node_modules/ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..5b43beb --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,18 @@ +image: debian:bullseye + +before_script: +- apt-get update -y +- apt-get install -y locales openjdk-11-jre python3-pip +- sed -i 's/# \(es_ES.UTF-8 UTF-8\)/\1/' /etc/locale.gen +- sed -i 's/# \(en_US.UTF-8 UTF-8\)/\1/' /etc/locale.gen +- sed -i 's/# \(eo.UTF-8 UTF-8\)/\1/' /etc/locale.gen +- sed -i 's/# \(fr_FR.UTF-8 UTF-8\)/\1/' /etc/locale.gen +- dpkg-reconfigure --frontend=noninteractive locales +- pip3 install babel beautifulsoup4 html5validator markdown pelican css-html-js-minify +- export LANG=es_ES.UTF-8 LANGUAGE=es_ES + +test: + script: + - (cd libretube-theme/ && make compile) + - cp -v Makefile.example Makefile + - make validate diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a871fcf --- /dev/null +++ b/LICENSE @@ -0,0 +1,662 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + 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. + + + Copyright (C) + + 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 . + +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 +. + diff --git a/Makefile.example b/Makefile.example new file mode 100644 index 0000000..93212ed --- /dev/null +++ b/Makefile.example @@ -0,0 +1,106 @@ +PY?=python3 +PELICAN?=pelican +PELICANOPTS= + +BASEDIR=$(CURDIR) +INPUTDIR=$(BASEDIR)/content +OUTPUTDIR=$(BASEDIR)/output +CONFFILE=$(BASEDIR)/pelicanconf.py +PUBLISHCONF=$(BASEDIR)/publishconf.py + +FTP_HOST=******** +FTP_USER=******** +FTP_TARGET_DIR=******** + +SSH_HOST=localhost +SSH_PORT=22 +SSH_USER=root +SSH_TARGET_DIR=/var/www + +DEBUG ?= 0 +ifeq ($(DEBUG), 1) + PELICANOPTS += -D +endif + +RELATIVE ?= 0 +ifeq ($(RELATIVE), 1) + PELICANOPTS += --relative-urls +endif + +help: + @echo 'Makefile for a pelican Web site ' + @echo ' ' + @echo 'Usage: ' + @echo ' make html (re)generate the web site ' + @echo ' make clean remove the generated files ' + @echo ' make regenerate regenerate files upon modification ' + @echo ' make hashover_backup backup of hashover ' + @echo ' make publish generate using production settings ' + @echo ' make serve [PORT=8000] serve site at http://localhost:8000 ' + @echo ' make serve-global [SERVER=0.0.0.0] serve (as root) to $(SERVER):80 ' + @echo ' make devserver [PORT=8000] serve and regenerate together ' + @echo ' make ssh_upload upload the web site via SSH ' + @echo ' make rsync_upload upload the web site via rsync+ssh ' + @echo ' make ftp_upload upload the web site via FTP ' + @echo ' make validate validate the web site via html5validator' + @echo ' ' + @echo 'Set the DEBUG variable to 1 to enable debugging, e.g. make DEBUG=1 html ' + @echo 'Set the RELATIVE variable to 1 to enable relative urls ' + @echo ' ' + +generate: + $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + +html: clean generate vendor + +clean: + [ ! -d $(OUTPUTDIR) ] || rm -rf $(OUTPUTDIR) + +regenerate: + $(PELICAN) -r $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) + +serve: +ifdef PORT + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) +else + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) +endif + +serve-global: +ifdef SERVER + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b $(SERVER) +else + $(PELICAN) -l $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) -b 0.0.0.0 +endif + +devserver: +ifdef PORT + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) -p $(PORT) +else + $(PELICAN) -lr $(INPUTDIR) -o $(OUTPUTDIR) -s $(CONFFILE) $(PELICANOPTS) +endif + +vendor: + @bash $(BASEDIR)/scripts/vendor.sh + +publishconf: + $(PELICAN) $(INPUTDIR) -o $(OUTPUTDIR) -s $(PUBLISHCONF) $(PELICANOPTS) + +publish: publishconf vendor + +ssh_upload: publish + scp -P $(SSH_PORT) -r $(OUTPUTDIR)/* $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR) + +hashover_backup: + rsync -rvzc $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)/hashover-next $(BASEDIR)/local.env/ + +rsync_upload: publish + rsync -e "ssh -p $(SSH_PORT)" -P -rvzc --delete $(OUTPUTDIR)/ $(SSH_USER)@$(SSH_HOST):$(SSH_TARGET_DIR)/ + +ftp_upload: publish + lftp ftp://$(FTP_USER)@$(FTP_HOST) -e "mirror -R $(OUTPUTDIR) $(FTP_TARGET_DIR) ; quit" + +validate: publishconf + html5validator --root $(OUTPUTDIR) || html5validator -l --root $(OUTPUTDIR) + +.PHONY: html help clean regenerate serve serve-global devserver publish ssh_upload rsync_upload ftp_upload diff --git a/README.md b/README.md new file mode 100644 index 0000000..a47d4e2 --- /dev/null +++ b/README.md @@ -0,0 +1,254 @@ +## Descripción + +Este repositorio contiene el sitio web LibreTube, ubicado en +. + +## Generar LibreTube + +### Instalación de dependencias + +Puedes generar LibreTube en tu ordenador. Para ello necesitas tener +los siguientes programas instalados: +* [Pelican](https://github.com/getpelican/pelican). Es el generador de páginas +* [Python](http://python.org/). Es el lenguaje de programación en el que + está escrito Pelican. +* [PHP](https://www.php.net/). Lenguaje de programación usado para el buscador + y formulario de comentarios. +* [Markdown](https://pypi.python.org/pypi/Markdown/). Markdown + es el lenguaje de marcado ligero en el que están escritos los + artículos y páginas. +* [Jinja2](https://palletsprojects.com/p/jinja/). Un motor de plantillas muy rápido y expresivo. +* [Babel](https://pypi.org/project/Babel/). Para la traducción del tema + de la página. +* [BeautifulSoup4](https://pypi.python.org/pypi/beautifulsoup4/). + Requerido por el complemento tipue-search. + +Instalar `virtualenv` con: + +Distros basadas en Debian: + +```console +$ sudo apt install virtualenv +``` + +Distros basadas en Arch: + +```console +$ sudo pacman -S python-virtualenv +``` + +No es realmente necesario, pero es muy recomendable instalar [GNU +Make](https://gnu.org/software/make). En la siguiente sección se asume +que tienes Make instalado. + ++ En sistemas operativos basados en Arch se + puede instalar con la instrucción: + + $ sudo pacman -S make + ++ En sistemas operativos basados en Debian se + puede instalar con la instrucción: + + $ sudo apt install make + +### Generar el contenido + +Tras instalar las dependencias, puedes generar el blog ejecutando las +siguientes órdenes: +1. `git clone https://notabug.org/heckyel/libretube` +2. `cd libretube` +3. `virtualenv -p python3 venv` +4. `source venv/bin/activate` +5. `pip install -U -r requirements.txt` +6. `(cd libretube-theme && make compile)` +7. `cp -v Makefile.example Makefile` +8. `make html` + +Tras completar estos pasos, el blog estará disponible en la carpeta +`output`. Abre el archivo `output/index.html` con tu navegador favorito +para ver el blog. + +## Colaboración + +### Escribir un artículo + +Si quieres publicar un artículo en LibreTube, puedes realizar un *pull +request* o [mandarme el artículo por correo +electrónico](mailto:heckyel@riseup.net). Si el artículo es +interesante, puede que lo acepte. + +Si no sabes cómo funciona Pelican, puedes mándame el artículo por correo +sin preocuparte por el formato. Si quieres hacer un *pull request*, +debes utilizar los metadatos de Pelican y escribir el artículo en +[Markdown](https://es.wikipedia.org/wiki/Markdown). A continuación +se muestra un ejemplo. + +```markdown +Author: Nombre de la autora +Category: Python +Date: 2017-12-03 10:20 +Slug: titulo-del-artículo +Tags: pelican, publishing +Title: Título del artículo + +Este es el contenido del artículo. Puedo usar la sintaxis de +[Markdown](https://es.wikipedia.org/wiki/Markdown) +``` + +El contenido de LibreTube se encuentra bajo dominio público +([CC0 1.0 Universal](https://creativecommons.org/publicdomain/mark/1.0/)). +Si quieres publicar tu artículo usando otra licencia, indícalo. + +Cuando escribas un artículo intenta utilizar +[etiquetas](https://lablibre.tuxfamily.org/tags/) y +[categorías](https://lablibre.tuxfamily.org/categories/) que ya existan, no +utilices el nombre de la categoría del artículo también como etiqueta. + +Si necesitas alguna funcionalidad especial (como un vídeo, una imagen de +cabecera...) intenta utilizar complementos o funcionalidades que ya +estén presentes en el blog. Consulta ejemplos de artículos que hacen uso +de estos. + +### Hacer una traducción + +Copia el archivo que quieres traducir y añade el código del idioma (por +ejemplo `.de` para el alemán) antes de la extensión `.md`. Traduce el +contenido del artículo o la página. Cuando termines, cambia los +metadatos que hagan falta (título, autor, etc.) y añade el metadato +`Lang` con el valor del código del idioma de la traducción. A +continuación se muestra un ejemplo. + +``` +Author: nameauthor +Date: 2017-02-28 01:11 +Lang: de +Slug: reflexión-sobre-los-medios-de-comunicación +Tags: Bücher, Fernsehen, freie Software, Internet, Kommentar, Medien +Title: Kommentar zu der Medien + +Heutzutage gibt es viele Medien, die vorher nicht existierten. Das [...] +``` + +### Mejora de la página + +También puedes mejorar la apariencia y funcionalidad de la página. +Simplemente crea un *pull request*. Antes de hacerlo, te recomendamos +conocer [cómo se organiza la estructura de +directorios](https://lablibre.tuxfamily.org/pages/estructura-de-directorios.html). +También es +recomendable comprobar si el código +HTML +es válido ejecutando `make validate` en la carpeta del proyecto (debes +tener +GNU Make +y [html5validator](https://pypi.python.org/pypi/html5validator) +instalados). +También es necesario tener instalado Java para que funcione `html5validator`: + + $ sudo pacman -S jdk8-openjdk jre8-openjdk-headless + +Comprobar versión de Java: + +```console +$ java -version +openjdk version "1.8.0_121" +OpenJDK Runtime Environment (IcedTea 3.3.0) (Hyperbola GNU/Linux-libre build 8.u121_3.3.0-1.hyperbola4-x86_64) +OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) +``` + +## Información de licencias + +El contenido de este sitio web se encuentra bajo dominio público, +excepto donde se especifique lo contrario. + +Todo el código es software libre; se encuentra bajo la licencia AGPLv3, salvo +las siguientes excepciones: + +- Licencias de JavaScript. La información sobre las licencias de + JavaScript se encuentra en el archivo `content/pages/libreJS.md` en + forma de [tabla preparada para ser leída por LibreJS](https://www.gnu.org/software/librejs/manual/librejs.html#JavaScript-Web-Labels). +- Todo lo que hay en el directorio `libretube-theme` se encuentra bajo la licencia GPLv3. +- Los siguientes complementos para Pelican (se encuentran en el + directorio `plugins`): + + - **another_read_more_link**. Bajo la licencia [Apache License, Version 2.0](https://git.sr.ht/~heckyel/libretube/blob/master/plugins/another_read_more_link/LICENSE). + - **compressor**. Bajo la licencia AGPLv3. + - **get_app_version**. Bajo la licencia GPLv3. + - **i18n_subsites**. Bajo la licencia GPLv3. + - **Neighbor Articles Plugin for Pelican**. Bajo la licencia GPLv3. + - **pelican-css-js**. Bajo la licencia GPLv3. + - **sitemap**. Bajo la licencia AGPLv3. + - **tag-cloud**. Bajo la licencia AGPLv3. + - **tipue-search**. Bajo la licencia AGPLv3. + +## Preguntas frecuentes + +### ¿Dónde esta alojado el repositorio con el código fuente? + +Está alojado en , y hay +copias en otros lugares: +- https://notabug.org/heckyel/libretube + +### ¿Y el sistema de comentarios? + +LibreTube utiliza el sistema de comentarios +[Hashover](https://github.com/jacobwb/hashover-next), el cual es +software libre: +- [Código fuente del lado del servidor](https://lablibre.tuxfamily.org/hashover-next/backend/source-viewer.php) +- [Código JavaScript](https://lablibre.tuxfamily.org/hashover-next/comments.php) +- [Diseño](https://libregit.org/heckyel/material-hashover) + +### ¿Y los vídeos? + +Los vídeos que contiene LibreTube no se encuentran +en este repositorio por varias razones: + +- No es nada útil añadir los vídeos al repositorio, pues Git no está + hecho para controlar los cambios en los vídeos. Además, normalmente no + se suelen modificar los vídeos ya creados. +- Solo harían que este repositorio fuera más pesado aún. +- Algunos vídeos no se encuentran alojados en el servidor de LibreTube. + +La siguiente tabla contiene algunos de los vídeos que se encuentran en LibreTube: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TítuloFuente
Citizenfourhttps://archive.org/download/libreweb/citizenfour-spanish.webm
¿Cómo generar Freak Spot?https://archive.org/download/libreweb/freakspot.webm
Locutus de GNUhttps://archive.org/download/libreweb/locutus.webm
Montar Android en Hyperbola + +
Prompt avanzadohttps://archive.org/download/libreweb/0001-15599.webm
RMS en dominio digitalhttps://archive.org/download/libreweb/StallmanenDominioDigital.webm
Sin pararhttps://archive.org/download/libreweb/sin_parar.webm
diff --git a/content/articles/emacsen-000-de-luis-saravia-para-sus-hijos.md b/content/articles/emacsen-000-de-luis-saravia-para-sus-hijos.md new file mode 100644 index 0000000..53d9e41 --- /dev/null +++ b/content/articles/emacsen-000-de-luis-saravia-para-sus-hijos.md @@ -0,0 +1,22 @@ +Author: LuiSaravia. +Category: Love +Date: 2010-01-11 15:30 +Image: emacsen-000-de-luis-saravia-para-sus-hijos.png +License: CC BY-NC 3.0 +Lang: es +Og_video: {static}/wp-content/uploads/emacsen-000-de-luis-saravia-para-sus-hijos.mp4 +VideoID: 5dde21e2440de0fcda01bf +Slug: Papá +Tags: familia, amor, papa, mama, hermanos +Time: 2:00 +Title: De Luis Saravia para sus hijos + +
+ +
+

De Luis Saravia para sus hijos

+
+
\ No newline at end of file diff --git a/content/heckyel_pub.asc b/content/heckyel_pub.asc new file mode 100644 index 0000000..b4c1c64 --- /dev/null +++ b/content/heckyel_pub.asc @@ -0,0 +1,422 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +/BiYz88KRSNBoNLFFmgSWXlj2LtCdD3L8KxZ+iP0ovwQhCsQ2IbORnJIWw0LjDWb +xVH74PF4WEcH6MeOMIkfhF2cI/S8rDHhjP3wQyPGEMWErLw+ccMWP7EMQ3WHl8l4 +u8fuLJCYxIe7EPkvCY3uJ74fB+khMe5+DL2L3P0vcbF4IeOBOxF7jEyy0PEZFH// +xAA2EAABAwEFBAgEBwEBAAAAAAABAAIRIQMSMUFREDBhcQQTICIyUoGRQGKh8CNC +coKxwdE0FP/aAAgBAQAGPwLed61D3+VqPVdGZ+9f83R/Z3+r/l6N7H/V3+jdG9L3 ++oDpNh1Y1aVNh0hr+Gfw02ru95Qi2ycbKy0GKvOOPamyJZyTest3XfmKoQLQUI+D +N1w644BOfaOvPcpmTuKId4ROGqfZW1o26PBeNVLHBw1HwFpbOwaJVpa2hz9kTooz +3V+zaL+ElMc4/qylNtbN15rhv2dEs3mIl8Izi5EBTupJhMDmTZg11X/he69ZWlbF +++ceCtTevd6pOw7eCoq7MOy0Z5pjS7Pu8FZk5t3tu85NKfz2gq97KNVJXhlTdMKV +SoVD2GOVhaMN4Xd70k8EdoBxUVCkhYqqgBYIusTI8qi0BooaOw5ky2jm+u96UD5U +5c1Gql2CA7VV3rMc1AaEXRHDY0Lo4I75bXe9IOrYROqCa6NyUXXZKIAx2WDIoXIN +GAEb3pFJIbOwWjhjhsxVXBUcOzU7cKpwK6LBHiz3z2POITm/MmtjJG84rvGeapLC +r1laSg20nZKizUlxau9bKjwrloORVlaDPFWB9d6SnWmpV3jOw3QSU+0t3lnyMKtb +to9kOgNVnbZOAkIU2AaouhC3Lbs0aF1IuNfEiqNjbCHjVTmmnQo9Ke0mRAV6zO8f +yTQnPyDdmCBYSzkuudYg2mMwquPLaJQ911FtzaQn2sdZanDgg8iCMFCP6grFuUK6 +MHDeOHBP4Jz9xHauOFLwTYwCB8o3tq04E0RvdqTtg9u8cTvQ/tCV1d1wyDstkOeA +TgmuGfaa0Cia3Qb2CpB7p7MStVipuhztSpd6R2YV9www3459nFeILJZdrrH5ZKBQ +b87ZVQV3QQ1eEqLrlg5RaKh7DeNfgHBHbgqU5bMlQKoVJ2gBNbp8DfGB3nWnAYfB +EGoTmjDdaMGJQa0UHwb1RYrFYrHbiqJ86/B+IJ13w7KbK9iux3WuusKmytA/l8C3 +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 +=WvAu +-----END PGP PUBLIC KEY BLOCK----- diff --git a/content/pages/404.md b/content/pages/404.md new file mode 100644 index 0000000..4a19008 --- /dev/null +++ b/content/pages/404.md @@ -0,0 +1,7 @@ +Date: 2017-02-22 16:54 +Modified: 2017-10-08 03:07 +Save_as: 404.html +Status: hidden +Title: No se encontró la página + +Parece que no hay nada en este lugar. ¿Y si pruebas una búsqueda? diff --git a/content/pages/acerca-de.eo.md b/content/pages/acerca-de.eo.md new file mode 100644 index 0000000..75c8504 --- /dev/null +++ b/content/pages/acerca-de.eo.md @@ -0,0 +1,19 @@ +Author: Jesús E. +Date: 2016-07-28 17:43 +Lang: eo +Modified: 2017-04-27 16:15 +Slug: acerca-de +Status: hidden +Title: Pri + +## Kio estas LibreTube? + +LibreTube estas videa eldona platformo sen kodiga procezo +sur la servilo. I estas simpla kaj simpla retejo por la prezentado de videoj. + +## Kunlaborado + +Vi povas skribi artikulojn por ĉi tia retpaĝaro, traduki aŭ kunlabori +kun la programado. En la +[legumino da fonta kodo da retpaĝaro](https://libregit.org/heckyel/libretube/src/master/README.markdown#colaboraci%C3%B3n) +estas la informo pri kiel fari ĝin. diff --git a/content/pages/acerca-de.md b/content/pages/acerca-de.md new file mode 100644 index 0000000..4ac31cd --- /dev/null +++ b/content/pages/acerca-de.md @@ -0,0 +1,22 @@ +Author: Jesús E. +Date: 2019-02-04 08:03 +Lang: es +Modified: 2019-02-04 09:03 +Slug: acerca-de +Status: hidden +Title: Acerca + +## ¿Qué es LibreTube? + +LibreTube es una plataforma de publicación de vídeos sin proceso de codificación +en el servidor. Es una web simple y sencilla para la presentación de vídeos. + +## Colaboración + +Puedes escribir un artículo de vídeo para este sitio web, hacer una +traducción o colaborar en el desarrollo. La información sobre cómo +hacerlo, se encuentra en el +[README del código fuente de la web][colaboracion]. + +[colaboracion]: https://libregit.org/heckyel/libretube/src/branch/master/README.md +[libertades]: https://www.gnu.org/philosophy/free-sw.html diff --git a/content/pages/apoyo-economico.en.md b/content/pages/apoyo-economico.en.md new file mode 100644 index 0000000..ddfc329 --- /dev/null +++ b/content/pages/apoyo-economico.en.md @@ -0,0 +1,18 @@ +Author: Jesús E. +Date: 2017-10-28 17:46 +Lang: en +Modified: 2018-07-03 03:17 +Slug: apoyo-economico +Status: published +Title: Economic support + +Since its birth, this website has used only free software and has been +free of ads. However, maintaining a website like this one requires both +time and money. [Donations]({filename}/pages/donaciones.en.md) for +encourage its development and improvement. + +You can choose between different donation methods. + +## Liberapay + +Donate diff --git a/content/pages/apoyo-economico.eo.md b/content/pages/apoyo-economico.eo.md new file mode 100644 index 0000000..07c8a86 --- /dev/null +++ b/content/pages/apoyo-economico.eo.md @@ -0,0 +1,15 @@ +Author: Jesús E. +Date: 2018-07-03 02:06 +Lang: eo +Slug: apoyo-economico +Status: published +Title: Ekonomika subteno + +Ekde ĝia nasko, ĉi tia retpaĝaro uzis nur liberan programaron kaj +estis sen anoncoj. Tamen, bonteni retpaĝaron kiel ĉi tia bezonas kaj +tempon kaj monon. [Donacoj]({filename}/pages/donaciones.eo.md) por +instigi ĝian ellaboradon kaj plibonigon. + +## Liberapay + +Donaci diff --git a/content/pages/apoyo-economico.md b/content/pages/apoyo-economico.md new file mode 100644 index 0000000..5d51309 --- /dev/null +++ b/content/pages/apoyo-economico.md @@ -0,0 +1,19 @@ +Author: Jesús E. +Date: 2017-01-22 18:33 +Lang: es +Modified: 2018-04-29 22:48 +Slug: apoyo-economico +Status: published +Title: Apoyo económico + +Desde su nacimiento, esta página ha usado solo software libre y ha +estado libre de publicidad. Sin embargo, para mantener un sitio web como +este se requiere tiempo y dinero. Las +[donaciones]({filename}/pages/donaciones.md) son para +fomentar su desarrollo y mejora. + +Puedes eligir entre diferentes formas de realizar donaciones. + +## Liberapay + +Dona diff --git a/content/pages/buscar.php.md b/content/pages/buscar.php.md new file mode 100644 index 0000000..e9de76a --- /dev/null +++ b/content/pages/buscar.php.md @@ -0,0 +1,195 @@ +Author: Jorge Maldonado Ventura +Date: 2017-04-22 20:38 +Modified: 2020-06-11 11:38 +Save_as: buscar.php +Status: hidden +Title: Resultados + +
+ 0) { + $score += 10 * $match_count; + } + + } + if ($score != 0) { + $found_results[] = [ + 'score' => $score, + 'title' => $page['title'], + 'time' => $page['time'], + 'videoThumbnail' => $page['videoThumbnail'], + 'url' => $page['url'], + 'published' => $page['published'], + 'publishedText' => $page['publishedText'], + 'author' => $page['author'], + 'authorUrl' => $page['authorUrl'], + ]; + } + } + + /** + * Compare results score. + */ + function comp_result_score($a, $b) { + if ($a['score'] == $b['score']) { + return 0; + } + return ($a['score'] > $b['score']) ? -1 : 1; + }; + + if ($stop_words_ignored) { + printf(' +
+
%s
+
+
', 'Algunas palabras «comunes» fueron ignoradas'); + } + + $found_results_count = count($found_results); + + if ($found_results_count > 0) { + usort($found_results, 'comp_result_score'); + if ($found_results_count == 1) { + $found_results_count_str = NULL; + } + } else if ($found_results_count == 0) { + $found_results_count_str = NULL; + printf('
%s
', 'No se ha encontrado nada'); + } + + // Init head + printf(' +
+
'); + foreach ($found_results as $found_result) { + printf(' + ', + $found_result['url'], $found_result['videoThumbnail'], $found_result['title'], + $found_result['time'], $found_result['url'], $found_result['title'], + $found_result['title'], $found_result['published'], $found_result['publishedText'], + $found_result['authorUrl'], $found_result['author']); + } + +} else { + printf('
%s
', 'Aún no has buscado'); +} +// End head +printf('
+
'); +?> +
diff --git a/content/pages/contacto.de.md b/content/pages/contacto.de.md new file mode 100644 index 0000000..2bf587c --- /dev/null +++ b/content/pages/contacto.de.md @@ -0,0 +1,14 @@ +Author: Jesús E. +Date: 2019-02-04 07:52 +Lang: de +Modified: 2019-02-04 07:55 +Slug: contacto +Status: published +Title: Kontakt + +Mein Email ist +[heckyel@hyperbola.info](mailto:heckyel@hyperbola.info). Nutz +meinen +GPG öffentlichen Schlüssel +([4DF2 1B6A 7C10 21B2 5C36 0914 F6EE 7BC5 9A31 5766]({filename}/heckyel_pub.asc)), +damit die Nachricht nicht von anderen Personen gelesen werden kann. diff --git a/content/pages/contacto.en.md b/content/pages/contacto.en.md new file mode 100644 index 0000000..91f9b34 --- /dev/null +++ b/content/pages/contacto.en.md @@ -0,0 +1,13 @@ +Author: Jesús E. +Date: 2019-02-04 07:51 +Lang: en +Modified: 2019-02-04 07:52 +Slug: contacto +Status: published +Title: Contact + +My email is +[heckyel@hyperbola.info](mailto:heckyel@hyperbola.info). Use my +GPG public key +([4DF2 1B6A 7C10 21B2 5C36 0914 F6EE 7BC5 9A31 5766]({filename}/heckyel_pub.asc)) +so that other people cannot read the message. diff --git a/content/pages/contacto.eo.md b/content/pages/contacto.eo.md new file mode 100644 index 0000000..31b8cc8 --- /dev/null +++ b/content/pages/contacto.eo.md @@ -0,0 +1,12 @@ +Author: Jesús E. +Date: 2019-02-04 07:36 +Lang: eo +Slug: contacto +Status: published +Title: Kontakto + +Mia retpoŝto estas +[heckyel@hyperbola.info](mailto:heckyel@hyperbola.info). Uzu mian +GPG publikan ŝlosilon +([4DF2 1B6A 7C10 21B2 5C36 0914 F6EE 7BC5 9A31 5766]({filename}/heckyel_pub.asc)) +por ke aliaj personoj ne povus legi la mesaĝon. diff --git a/content/pages/contacto.md b/content/pages/contacto.md new file mode 100644 index 0000000..af7c80e --- /dev/null +++ b/content/pages/contacto.md @@ -0,0 +1,13 @@ +Author: Jesús E. +Date: 2019-02-04 07:36 +Lang: es +Modified: 2019-02-04 07:38 +Slug: contacto +Status: published +Title: Contacto + +Mi correo electrónico es +[heckyel@hyperbola.info](mailto:heckyel@hyperbola.info). Utiliza mi +clave pública GPG +([4DF2 1B6A 7C10 21B2 5C36 0914 F6EE 7BC5 9A31 5766]({filename}/heckyel_pub.asc)) +para evitar que el mensaje pueda ser leído por otras personas. diff --git a/content/pages/donaciones.de.md b/content/pages/donaciones.de.md new file mode 100644 index 0000000..34f0376 --- /dev/null +++ b/content/pages/donaciones.de.md @@ -0,0 +1,21 @@ +Author: Jorge Maldonado Ventura +Date: 2018-03-29 00:29 +Lang: de +Slug: donaciones +Status: hidden +Title: Spenden + + + + + + + + + + + + + + +
DatumSpenderWährungAnzahl
2018-02-12NamenlosFaircoin0,008
diff --git a/content/pages/donaciones.en.md b/content/pages/donaciones.en.md new file mode 100644 index 0000000..ed7729f --- /dev/null +++ b/content/pages/donaciones.en.md @@ -0,0 +1,21 @@ +Author: Jorge Maldonado Ventura +Date: 2018-03-29 00:29 +Lang: en +Slug: donaciones +Status: hidden +Title: Donations + + + + + + + + + + + + + + +
DateDonorCurrencyAmount
2018-02-12AnonymousFaircoin0.008
diff --git a/content/pages/donaciones.eo.md b/content/pages/donaciones.eo.md new file mode 100644 index 0000000..8257ac4 --- /dev/null +++ b/content/pages/donaciones.eo.md @@ -0,0 +1,21 @@ +Author: Jorge Maldonado Ventura +Date: 2018-03-29 00:29 +Lang: eo +Slug: donaciones +Status: hidden +Title: Donatoj + + + + + + + + + + + + + + +
DatoDonacantojValutoKvanto
2018-02-12anonimaFaircoin0,008
diff --git a/content/pages/donaciones.fr.md b/content/pages/donaciones.fr.md new file mode 100644 index 0000000..67418f5 --- /dev/null +++ b/content/pages/donaciones.fr.md @@ -0,0 +1,21 @@ +Author: Jorge Maldonado Ventura +Date: 2018-03-29 00:29 +Lang: fr +Slug: donaciones +Status: hidden +Title: Donations + + + + + + + + + + + + + + +
DateDonateurDeviseMontant
2018-02-12AnonymeFaircoin0,008
diff --git a/content/pages/donaciones.md b/content/pages/donaciones.md new file mode 100644 index 0000000..ecaa61f --- /dev/null +++ b/content/pages/donaciones.md @@ -0,0 +1,21 @@ +Author: Jorge Maldonado Ventura +Date: 2018-03-29 00:29 +Lang: es +Slug: donaciones +Status: hidden +Title: Donaciones + + + + + + + + + + + + + + +
FechaDonanteMonedaCantidad
2018-02-12AnónimaFaircoin0,008
diff --git a/content/pages/estructura-de-directorios.md b/content/pages/estructura-de-directorios.md new file mode 100644 index 0000000..e0c20a6 --- /dev/null +++ b/content/pages/estructura-de-directorios.md @@ -0,0 +1,80 @@ +Author: Jorge Maldonado Ventura +Date: 2018-01-28 17:35 +Lang: es +Slug: estructura-de-directorios +Status: hidden +Title: Estructura de directorios + +## Ficheros del directorio raíz + +- `LICENSE`. La licencia de software libre del proyecto. +- `Makefile`. Archivo para la automatización de tareas. +- `pelicanconf.py`. Configuración local del proyecto. +- `publishconf.py`. Configuración en producción de la web. + +Si hace falta cambiar algún parámetro de configuración genérico, se debe +editar el archivo `pelicanconf.py`. De tratarse de un ajuste que solo +necesita aplicarse durante la generación final, debe añadirse a +`publishconf.py`. Ejecuta `make` sin parámetros en este dictorio para +ver todas las opciones de `Makefile` disponibles. + +## Directorios + +- `content`. Contenido de la web: artículos, páginas, imágenes, etc. +- `libretube-theme`. Diseño de la página web. +- `plugins`. Complementos para Pelican. +- `output`. El directorio donde se suele generar la página web. + +Algunos de estos directorios se explican con más detalle a continuación. + +### `content` + +Aquí se guarda todo el contenido de la web. Todos los artículos se +encuentran en este directorio, incluidas las traducciones a artículos. +Los archivos de traducción indican el código del idioma antes de la +extensión `.md`. Si existe un artículo llamado `texto-sobre-algo.md`, +entonces la traducción al esperanto, por ejemplo, se debe llamar +`texto-sobre-algo.eo.md`. El idioma principal de la web es el +castellano. + +Además de los artículos hay otro tipo de contenido que se organiza en +directorios: + +- `asciicast`. Vídeos realizados con asciinema. +- `css`. El código CSS. +- `fonts`. Fuentes tipográficas. +- `js`. Código JavaScript. +- `pages`. Páginas que se encuentran en la barra lateral. +- `wp-content`. Contiene todo lo que no encaja en ningún otro sitio. En + gran parte contiene imágenes. Los archivos se han de ubicar en la + carpeta correspondiente al año y al mes en el que se añaden. Por + ejemplo, el directorio `/wp-content/uploads/article/images/2018/01/` + contiene los archivos de enero de 2018. + +El código CSS, JS y las fuentes aquí encontrados no aparecen en todos +los artículos. Por esta razón, se ubican aquí (y no en `cl-theme`)y +son cargados cuando un artículo los necesita usando los complementos +pelican-css y pelican-js + +### `libretube-theme` + +Contiene varias carpetas: + +- `static`. Aquí se encuentran los archivos estáticos (como imágenes, + fuentes tipográficas, JavaScript, CSS) +- `templates`. Aquí están las plantillas que usan el lenguaje Jinja2. + Puedes aprender más sobre los archivos de plantillas de Pelican y cómo + acceder a sus variables en [su + documentación](http://docs.getpelican.com/en/stable/themes.html) (solo + está disponible en inglés). +- `translations`. Aquí se ubican las traducciones del tema de la página. + +Además están los archivos `Makefile`, que contiene las intrucciones más +comunes para trabajar con traducciones; `babel.cfg`, la configuración de +traducciones; y `message.po`, el catalogo de mensajes traducibles. + +### `plugins` + +Para aprender cómo funcionan los complementos en Pelican, consulta [su +documentación](http://docs.getpelican.com/en/stable/plugins.html) +(solo está disponible en inglés). diff --git a/content/pages/libreJS.md b/content/pages/libreJS.md new file mode 100644 index 0000000..ae01036 --- /dev/null +++ b/content/pages/libreJS.md @@ -0,0 +1,34 @@ +Author: Jesús E. +Date: 2019-04-01 19:46 +Modified: 2019-04-28 10:03 +Slug: librejs +Status: hidden +Title: LibreJS + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Tabla de Licencias de JavaScript
ArchivoLicenciaFuente
plyr.min.jsExpatplyr.tar.gz
play.jsGPL-3.0play.js
hashover.jsAGPL-3.0hashover.js
diff --git "a/content/pages/pol\303\255tica-de-uso.eo.md" "b/content/pages/pol\303\255tica-de-uso.eo.md" new file mode 100644 index 0000000..2767ee5 --- /dev/null +++ "b/content/pages/pol\303\255tica-de-uso.eo.md" @@ -0,0 +1,56 @@ +Author: Jesús E. +Date: 2018-08-08 18:14 +Lang: eo +Save_as: pages/regularo-pri-uzado +Slug: política-de-uso +Status: hidden +Title: Regularo pri uzado +Url: pages/regularo-pri-uzado + +Oni akceptas sugestojn kaj aliigojn de ĉi tiu regularo adresitaj per la +[koncernaĵo-administrilo de LibreTube](https://libregit.org/heckyel/libretube/issues) +aŭ per [nia kontakta retpoŝto]({filename}/pages/contacto.md). + +## Kondiĉaro pro uzado + +Ni ne akceptas la respondecon pri la eblaj problemoj derivitaj de la +uzado de nia retpaĝaro. Ni akceptas kritikojn kaj korrektojn por pliboni +la paĝaron kaj solvi la eblajn erarojn, kiujn ni havigu. + +LibreTube respektas la opiniojn, kritikojn kaj proponojn esprimitaj en +komentoj. Ni havas la rajton forigi la spamojn. + +Kiam ebla, ni penas fari la paĝaron alirebla al pli granda nombro de +homoj eble: al malkapablaj homoj; al kiu retumas kun Ĝavaskripto +maleblita; al homoj, kiu uzas teksto-retumilojn; kun multa trafiklimigo, +ktp. + +Kie ne notita kontraŭon, la licencoj de LibreTube estas la +[CC0](https://creativecommons.org/publicdomain/mark/1.0/deed.eo) de +publikaĵo, por la enhavo (tekstoj, bildoj, videoj, komentoj...), kaj la +AGPLv3 de +libera programaro, por la programaro. LibreTube Lankaŭ uzas +programaron farita de aliaj, kiu povas trovi je alia licenco de libera +programaro, konsultu [informon pri +licencoj](https://libregit.org/heckyel/libretube#informaci%C3%B3n-de-licencias) +por pli informo pri la programaraj licencoj. + +## Regularo pri privateco + +LT estas gastita en [Tuxfamily](https://tuxfamily.org/). +Ci tiu provizanto de gastigo uzas +[Nginx](https://eo.wikipedia.org/wiki/Nginx)-servilon, kiu +gastigas en dosieroj aliro-datumoj: IP, uzita retumilo, dato de vizito, ktp. Ĉi tiu +informo estas malpersona, sed oni povus ritali al vizitantaj homoj. Oni +povas viziti la retpaĝaron kun prokurilo kiel +[Tor](https://eo.wikipedia.org/wiki/Tor_(programaro)) aŭ +VPN por havi pli privatecon. + +Pri la artikoloj oni povas fari anonimajn komentojn, kun falsaj nomoj aŭ +kun realaj datumoj. Okaze de ajno volu forigi aŭ rektifi komenton, ri devu +[kontakti nin]({filename}/pages/contacto.md) +demonstranta, kiu vi skribis la komenton, en tiu kazo ni indikos, ke oni +eliminis aŭ modifis la komenton kiel ni trovis tion bone, ĉiam penante +esti plej travidebla eble kun la aliaj partoprenantoj de la konversacio +kaj evitante perdi la ĉirkaŭtekston de aliaj komentoj. diff --git "a/content/pages/pol\303\255tica-de-uso.md" "b/content/pages/pol\303\255tica-de-uso.md" new file mode 100644 index 0000000..34f9273 --- /dev/null +++ "b/content/pages/pol\303\255tica-de-uso.md" @@ -0,0 +1,63 @@ +Author: Jesús E. +Date: 2018-03-05 16:30 +Modified: 2018-07-28 15:50 +Lang: es +Slug: política-de-uso +Status: hidden +Title: Política de uso + +Se aceptan sugerencias y cambios a estas políticas enviados mediante el +[gestor de incidencias de LibreTube](https://libregit.org/heckyel/libretube/issues) +o usando +nuestro [correo de contacto]({filename}/pages/contacto.md). + +## Condiciones de uso + +No nos hacemos responsables sobre los posibles problemas derivados del +uso de nuestro sitio web. Aceptamos críticas y correcciones para mejorar +la página y subsanar los posibles errores que hayamos podido cometer. + +LibreTube respeta las opiniones, críticas o sugerencias expresadas en +comentarios. Nos reservamos el derecho de eliminar mensajes +publicitarios. + +En la medida de lo posible, tratamos de hacer el sitio web accesible al +mayor número de personas posible: personas discapacitadas, a quien +navega con JavaScript desactivado, personas que usan navegadores de +texto, con poco ancho de banda, etc. + +Donde no se indique lo contrario, las licencias de LibreTube son la de +dominio público +[CC0](https://creativecommons.org/publicdomain/mark/1.0/), para el +contenido, +y la de software libre +AGPLv3, +para el software. LibreTube también usa software +producido por terceros que puede encontrar bajo otra licencia de +software libre, consulte [Información de +licencias](https://libregit.org/heckyel/libretube#informaci%C3%B3n-de-licencias) +para más información sobre las licencias de software. + +## Política de privacidad + +LT está alojado en [TuxFamily](https://tuxfamily.org). Este +proveedor de alojamiento web utiliza un servidor +[Nginx](https://es.wikipedia.org/wiki/Nginx) que almacena +en ficheros datos de acceso: dirección +IP, navegador utilizado, fecha de +visita, etc. Esta información no es personal, pero podría ser +relacionada con la persona visitante. El sitio web puede ser accedido +usando un proxy como +[Tor](https://es.wikipedia.org/wiki/Tor_(red_de_anonimato)) o una +RPV +para contar con mayor privacidad. + +Sobre los artículos se pueden realizar comentarios anónimos, con nombres +falsos o con datos reales. En caso de que alguien desee eliminar o +rectificar un comentario, deberá +[contactarnos]({filename}/pages/contacto.md) demostrándonos +que escribió ese comentario, en cuyo caso indicaremos que el comentario +ha sido eliminado o modificado de la forma que estimemos oportuna, +siempre intentando ser lo más transparentes posibles con el resto de +participantes en la conversación y evitando perder el contexto de otros +comentarios. diff --git a/content/robots.txt b/content/robots.txt new file mode 100644 index 0000000..3ede234 --- /dev/null +++ b/content/robots.txt @@ -0,0 +1,3 @@ +User-Agent: * + +Sitemap: https://lablibre.tuxfamily.org/sitemap.xml diff --git a/content/wp-content/uploads/article/images/emacsen-000-de-luis-saravia-para-sus-hijos.png b/content/wp-content/uploads/article/images/emacsen-000-de-luis-saravia-para-sus-hijos.png new file mode 100644 index 0000000..9a85250 Binary files /dev/null and b/content/wp-content/uploads/article/images/emacsen-000-de-luis-saravia-para-sus-hijos.png differ diff --git a/content/wp-content/uploads/article/thumbnail/emacsen-000-de-luis-saravia-para-sus-hijos.png b/content/wp-content/uploads/article/thumbnail/emacsen-000-de-luis-saravia-para-sus-hijos.png new file mode 100644 index 0000000..9a85250 Binary files /dev/null and b/content/wp-content/uploads/article/thumbnail/emacsen-000-de-luis-saravia-para-sus-hijos.png differ diff --git a/content/wp-content/uploads/article/videos/emacsen-000-de-luis-saravia-para-sus-hijos.mp4 b/content/wp-content/uploads/article/videos/emacsen-000-de-luis-saravia-para-sus-hijos.mp4 new file mode 100644 index 0000000..63b90db Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-000-de-luis-saravia-para-sus-hijos.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-001-reporte-y-como-empece.mp4 b/content/wp-content/uploads/article/videos/emacsen-001-reporte-y-como-empece.mp4 new file mode 100644 index 0000000..673be34 Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-001-reporte-y-como-empece.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-001-reporte.mp4 b/content/wp-content/uploads/article/videos/emacsen-001-reporte.mp4 new file mode 100644 index 0000000..4d0a629 Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-001-reporte.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-002-como-empece-detalles.mp4 b/content/wp-content/uploads/article/videos/emacsen-002-como-empece-detalles.mp4 new file mode 100644 index 0000000..4232234 Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-002-como-empece-detalles.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-002-eLisp-tipo-bash.mp4 b/content/wp-content/uploads/article/videos/emacsen-002-eLisp-tipo-bash.mp4 new file mode 100644 index 0000000..bacf0fb Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-002-eLisp-tipo-bash.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-003-touchpad.mp4 b/content/wp-content/uploads/article/videos/emacsen-003-touchpad.mp4 new file mode 100644 index 0000000..776671f Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-003-touchpad.mp4 differ diff --git a/content/wp-content/uploads/article/videos/emacsen-006-bloques-de-tiempo.mp4 b/content/wp-content/uploads/article/videos/emacsen-006-bloques-de-tiempo.mp4 new file mode 100644 index 0000000..2c1a3a1 Binary files /dev/null and b/content/wp-content/uploads/article/videos/emacsen-006-bloques-de-tiempo.mp4 differ diff --git a/content/wp-content/uploads/pages/images/2017/03/poster.png b/content/wp-content/uploads/pages/images/2017/03/poster.png new file mode 100644 index 0000000..8fc5185 Binary files /dev/null and b/content/wp-content/uploads/pages/images/2017/03/poster.png differ diff --git a/content/wp-content/uploads/pages/images/donaci.svg b/content/wp-content/uploads/pages/images/donaci.svg new file mode 100644 index 0000000..681a73e --- /dev/null +++ b/content/wp-content/uploads/pages/images/donaci.svg @@ -0,0 +1 @@ +Donaci \ No newline at end of file diff --git a/content/wp-content/uploads/pages/images/donar.svg b/content/wp-content/uploads/pages/images/donar.svg new file mode 100644 index 0000000..3562752 --- /dev/null +++ b/content/wp-content/uploads/pages/images/donar.svg @@ -0,0 +1 @@ +Donar \ No newline at end of file diff --git a/content/wp-content/uploads/pages/images/donate.svg b/content/wp-content/uploads/pages/images/donate.svg new file mode 100644 index 0000000..1ca05be --- /dev/null +++ b/content/wp-content/uploads/pages/images/donate.svg @@ -0,0 +1 @@ +Donate \ No newline at end of file diff --git a/content/wp-content/uploads/pages/subtitles/2017/03/english.vtt b/content/wp-content/uploads/pages/subtitles/2017/03/english.vtt new file mode 100644 index 0000000..d6c38e2 --- /dev/null +++ b/content/wp-content/uploads/pages/subtitles/2017/03/english.vtt @@ -0,0 +1,1209 @@ +WEBVTT + +1 +00:00:11.100 --> 00:00:15.360 +free software is the first battle in the + +2 +00:00:15.360 --> 00:00:17.360 +liberation of cyberspace + +3 +00:00:17.360 --> 00:00:20.080 +who controls your computer + +4 +00:00:20.080 --> 00:00:22.440 +is it you or is it some + +5 +00:00:22.440 --> 00:00:25.600 +big company that's really controlling it + +6 +00:00:25.830 --> 00:00:28.610 +well what is a computer a computer is a + +7 +00:00:28.610 --> 00:00:32.660 +universal machine it will do any + +8 +00:00:32.660 --> 00:00:35.640 +computation you wanted to because you + +9 +00:00:35.640 --> 00:00:37.770 +give it a program that says what the + +10 +00:00:37.770 --> 00:00:40.460 +computation is that you want so the + +11 +00:00:40.460 --> 00:00:42.510 +computer only knows how to get out and + +12 +00:00:42.510 --> 00:00:44.430 +instruction and do it and get add + +13 +00:00:44.430 --> 00:00:46.320 +another instruction and do it + +14 +00:00:46.320 --> 00:00:48.890 +the program has the instructions it says + +15 +00:00:48.890 --> 00:00:52.280 +what to do and so you by writing the + +16 +00:00:52.280 --> 00:00:53.870 +right program you can make it do + +17 +00:00:53.870 --> 00:00:56.760 +anything well almost anything + +18 +00:00:56.760 --> 00:00:59.480 +um so who gives the instructions to your + +19 +00:00:59.480 --> 00:01:01.890 +computer you might think it's obeying + +20 +00:01:01.890 --> 00:01:05.480 +your instructions when really it's + +21 +00:01:05.480 --> 00:01:08.760 +obeying somebody else first and you only + +22 +00:01:08.760 --> 00:01:11.100 +as much as that company wants it too + +23 +00:01:11.100 --> 00:01:14.640 +will let it listen to you with software + +24 +00:01:14.640 --> 00:01:16.380 +there are two possibilities either the + +25 +00:01:16.380 --> 00:01:19.470 +users control the program or the program + +26 +00:01:19.470 --> 00:01:22.740 +controls the users it's inevitably one + +27 +00:01:22.740 --> 00:01:23.850 +or the other + +28 +00:01:23.850 --> 00:01:26.580 +so in order for the users to control the + +29 +00:01:26.580 --> 00:01:28.790 +program they need the four essential + +30 +00:01:28.790 --> 00:01:32.670 +freedoms and that's the definition of + +31 +00:01:32.670 --> 00:01:36.900 +free software free software respects the + +32 +00:01:36.900 --> 00:01:39.000 +users freedom and community now we often + +33 +00:01:39.000 --> 00:01:41.460 +call it libra using the french or + +34 +00:01:41.460 --> 00:01:43.400 +spanish word pronounce it as you like + +35 +00:01:43.400 --> 00:01:45.810 +the point is that's what we mean we + +36 +00:01:45.810 --> 00:01:47.790 +don't mean it's gratis we're not talking + +37 +00:01:47.790 --> 00:01:49.970 +about price we're concerned with your + +38 +00:01:49.970 --> 00:01:53.430 +freedom and we sometimes say free / + +39 +00:01:53.430 --> 00:01:56.720 +libre to show that so freedom zeros the + +40 +00:01:56.720 --> 00:01:59.150 +freedom to run the program as you wish + +41 +00:01:59.150 --> 00:02:02.490 +for whatever purpose freedom one is the + +42 +00:02:02.490 --> 00:02:04.500 +freedom to study the source code of the + +43 +00:02:04.500 --> 00:02:07.740 +program and change it so it does the + +44 +00:02:07.740 --> 00:02:10.640 +computing you wanted to do but what is + +45 +00:02:10.640 --> 00:02:12.450 +the source code well every program + +46 +00:02:12.450 --> 00:02:13.550 +typically will have to + +47 +00:02:13.550 --> 00:02:16.730 +forms there's the form that you can read + +48 +00:02:16.730 --> 00:02:19.100 +and you can understand if you know the + +49 +00:02:19.100 --> 00:02:21.290 +programming language that's the source + +50 +00:02:21.290 --> 00:02:24.500 +that's what programmers write and change + +51 +00:02:24.500 --> 00:02:25.940 +then there's the executable which is a + +52 +00:02:25.940 --> 00:02:28.250 +bunch of numbers which even a programmer + +53 +00:02:28.250 --> 00:02:30.410 +can figure out if all you get is the + +54 +00:02:30.410 --> 00:02:32.810 +executable it's a horrible pain in the + +55 +00:02:32.810 --> 00:02:35.330 +neck to figure out what it does and even + +56 +00:02:35.330 --> 00:02:38.270 +harder to change it so to give you the + +57 +00:02:38.270 --> 00:02:41.600 +real possibility to study and change it + +58 +00:02:41.600 --> 00:02:42.880 +they've got to give you the source code + +59 +00:02:42.880 --> 00:02:46.190 +that's a requirement well with those two + +60 +00:02:46.190 --> 00:02:49.820 +freedoms each user separately can make a + +61 +00:02:49.820 --> 00:02:52.100 +copy and start changing it and make it + +62 +00:02:52.100 --> 00:02:53.750 +do what she wants + +63 +00:02:53.750 --> 00:02:57.650 +that's individual control but what if + +64 +00:02:57.650 --> 00:02:59.390 +you're not a programmer you look at the + +65 +00:02:59.390 --> 00:03:01.640 +source code and you don't understand it + +66 +00:03:01.640 --> 00:03:04.820 +individual control isn't enough + +67 +00:03:04.820 --> 00:03:07.700 +we also need collective control which + +68 +00:03:07.700 --> 00:03:09.260 +means any group of users are free to + +69 +00:03:09.260 --> 00:03:11.780 +work together to adapt the program to + +70 +00:03:11.780 --> 00:03:14.210 +what they want of course in the group + +71 +00:03:14.210 --> 00:03:16.430 +some of them are programmers they're the + +72 +00:03:16.430 --> 00:03:18.830 +ones who actually write the changes but + +73 +00:03:18.830 --> 00:03:20.450 +they're doing it as part of the group + +74 +00:03:20.450 --> 00:03:23.200 +for what the group wants course the + +75 +00:03:23.200 --> 00:03:25.340 +group doesn't have to be everybody so + +76 +00:03:25.340 --> 00:03:27.770 +others can use it some other way they're + +77 +00:03:27.770 --> 00:03:30.620 +all free to do that so collective + +78 +00:03:30.620 --> 00:03:32.630 +control requires two more essential + +79 +00:03:32.630 --> 00:03:34.970 +freedoms freedom to is the freedom to + +80 +00:03:34.970 --> 00:03:37.450 +redistribute exact copies to make the + +81 +00:03:37.450 --> 00:03:39.290 +copies and then give them away or sell + +82 +00:03:39.290 --> 00:03:42.500 +them when you wish and freedom three is + +83 +00:03:42.500 --> 00:03:44.420 +similar but it's for your modified + +84 +00:03:44.420 --> 00:03:46.550 +versions you're free to make copies and + +85 +00:03:46.550 --> 00:03:48.320 +then give them or sell them when you + +86 +00:03:48.320 --> 00:03:49.100 +wish + +87 +00:03:49.100 --> 00:03:51.500 +so we do have these freedoms that it's + +88 +00:03:51.500 --> 00:03:53.200 +free software the users control the + +89 +00:03:53.200 --> 00:03:55.700 +program but if any of those freedoms is + +90 +00:03:55.700 --> 00:03:58.940 +missing then the users don't control the + +91 +00:03:58.940 --> 00:04:01.400 +program instead the program controls the + +92 +00:04:01.400 --> 00:04:04.400 +users and the developer controls the + +93 +00:04:04.400 --> 00:04:07.790 +program so that means this program is an + +94 +00:04:07.790 --> 00:04:11.120 +instrument of unjust power for its + +95 +00:04:11.120 --> 00:04:15.800 +developer / the users that means the + +96 +00:04:15.800 --> 00:04:18.730 +users don't have freedom that's non-free + +97 +00:04:18.730 --> 00:04:20.570 +proprietary software which we got to get + +98 +00:04:20.570 --> 00:04:21.410 +rid of + +99 +00:04:21.410 --> 00:04:23.720 +well when you've got proprietary + +100 +00:04:23.720 --> 00:04:26.380 +software what happens sometimes + +101 +00:04:26.380 --> 00:04:30.100 +program snoops on the user sometimes it + +102 +00:04:30.100 --> 00:04:34.300 +tracks the user sometimes it restricts + +103 +00:04:34.300 --> 00:04:37.900 +the user and stop users from doing what + +104 +00:04:37.900 --> 00:04:39.700 +they want to do you can see that the + +105 +00:04:39.700 --> 00:04:41.200 +blu-ray is your enemy + +106 +00:04:41.200 --> 00:04:44.860 +um sometimes the software remotely + +107 +00:04:44.860 --> 00:04:48.190 +deletes books as Amazon did with 1984 + +108 +00:04:48.190 --> 00:04:54.310 +but sometimes the developer compels + +109 +00:04:54.310 --> 00:04:58.540 +users to install a harmful upgrade by + +110 +00:04:58.540 --> 00:05:00.190 +threatening to take away other + +111 +00:05:00.190 --> 00:05:03.460 +functionality if it's not installed as + +112 +00:05:03.460 --> 00:05:05.860 +Sony did and sometimes they can even + +113 +00:05:05.860 --> 00:05:08.560 +forcibly change the software at a + +114 +00:05:08.560 --> 00:05:11.380 +distance as Microsoft can with windows + +115 +00:05:11.380 --> 00:05:13.750 +through the universal back door + +116 +00:05:13.750 --> 00:05:17.350 +I'm so sometimes they even sabotage + +117 +00:05:17.350 --> 00:05:19.930 +users as Microsoft does when it tells + +118 +00:05:19.930 --> 00:05:23.860 +the NSA about bugs in windows so it can + +119 +00:05:23.860 --> 00:05:26.350 +use them to attack people's computers + +120 +00:05:26.350 --> 00:05:28.930 +well what you get is basically with + +121 +00:05:28.930 --> 00:05:32.110 +proprietary software the owner has power + +122 +00:05:32.110 --> 00:05:35.500 +over the users and takes advantage of + +123 +00:05:35.500 --> 00:05:37.450 +this power putting in those various + +124 +00:05:37.450 --> 00:05:40.600 +malicious functionalities to hurt the + +125 +00:05:40.600 --> 00:05:43.300 +users of course they don't do this + +126 +00:05:43.300 --> 00:05:45.460 +because they're Satanist they're doing + +127 +00:05:45.460 --> 00:05:48.340 +it just for money for greed they have + +128 +00:05:48.340 --> 00:05:51.160 +various ways that they can profit from + +129 +00:05:51.160 --> 00:05:54.430 +having this power over users which does + +130 +00:05:54.430 --> 00:05:56.890 +not make it even the tiniest bit less + +131 +00:05:56.890 --> 00:05:59.950 +evil but they have no shame about it + +132 +00:05:59.950 --> 00:06:02.200 +they have conferences where they talk + +133 +00:06:02.200 --> 00:06:04.540 +about the latest ways they can take + +134 +00:06:04.540 --> 00:06:06.850 +advantage of users through the power + +135 +00:06:06.850 --> 00:06:10.210 +they have basically proprietary software + +136 +00:06:10.210 --> 00:06:14.260 +which in is now from almost all the + +137 +00:06:14.260 --> 00:06:15.940 +users of proprietary software they're + +138 +00:06:15.940 --> 00:06:19.210 +using proprietary malware its software + +139 +00:06:19.210 --> 00:06:20.500 +for suckers + +140 +00:06:20.500 --> 00:06:23.560 +so how do us how do you stop being the + +141 +00:06:23.560 --> 00:06:27.100 +victim formerly you have to stop using + +142 +00:06:27.100 --> 00:06:28.930 +computers but not anymore + +143 +00:06:28.930 --> 00:06:30.820 +now you can come join us in the free + +144 +00:06:30.820 --> 00:06:36.460 +world that we've built but in 1983 i can + +145 +00:06:36.460 --> 00:06:38.620 +announce i would develop a completely + +146 +00:06:38.620 --> 00:06:39.840 +free software up + +147 +00:06:39.840 --> 00:06:44.160 +rating system called GNU in 1992 we had + +148 +00:06:44.160 --> 00:06:46.380 +almost finished but one piece was + +149 +00:06:46.380 --> 00:06:49.270 +missing the Kernel Linux or vaults in + +150 +00:06:49.270 --> 00:06:50.370 +that year + +151 +00:06:50.370 --> 00:06:53.190 +freed his Kernel Linux which filled the + +152 +00:06:53.190 --> 00:06:56.190 +last gap and gave us the first complete + +153 +00:06:56.190 --> 00:06:58.470 +system you could run on a pc GNU plus + +154 +00:06:58.470 --> 00:07:04.290 +Linux so unfortunately having freedom at + +155 +00:07:04.290 --> 00:07:06.390 +one more point doesn't guarantee you'll + +156 +00:07:06.390 --> 00:07:08.940 +keep it there are over a thousand + +157 +00:07:08.940 --> 00:07:11.880 +different variants of GNU/Linux called + +158 +00:07:11.880 --> 00:07:14.880 +distributions a few of them are entirely + +159 +00:07:14.880 --> 00:07:17.700 +free software most of them have non-free + +160 +00:07:17.700 --> 00:07:19.620 +software added because they are + +161 +00:07:19.620 --> 00:07:21.990 +maintained by people who aren't + +162 +00:07:21.990 --> 00:07:23.880 +concerned about freedom they rather and + +163 +00:07:23.880 --> 00:07:25.770 +convenience but at the cost of freedom + +164 +00:07:25.770 --> 00:07:29.490 +so you have to check which is a free + +165 +00:07:29.490 --> 00:07:32.550 +distro to keep your freedom sometimes + +166 +00:07:32.550 --> 00:07:34.470 +requires a sacrifice sometimes a big + +167 +00:07:34.470 --> 00:07:38.640 +sacrifice as at Lexington sometimes but + +168 +00:07:38.640 --> 00:07:41.580 +but in our campaign they tend to be + +169 +00:07:41.580 --> 00:07:45.270 +little sacrifices anybody with a little + +170 +00:07:45.270 --> 00:07:46.740 +bit of maturity can make these + +171 +00:07:46.740 --> 00:07:49.590 +sacrifices for instance you want + +172 +00:07:49.590 --> 00:07:51.660 +applications but some of them are + +173 +00:07:51.660 --> 00:07:55.360 +non-free if you want freedom you got it do without them + +174 +00:07:55.360 --> 00:07:57.840 +so there may be some inconvenience is + +175 +00:07:57.840 --> 00:08:00.120 +you have to suffer for your freedom sake + +176 +00:08:00.120 --> 00:08:04.830 +then many websites send non-free + +177 +00:08:04.830 --> 00:08:07.680 +programs written in JavaScript to the + +178 +00:08:07.680 --> 00:08:09.990 +users browser if you don't want to run + +179 +00:08:09.990 --> 00:08:11.940 +non-free programs you should install + +180 +00:08:11.940 --> 00:08:15.490 +libre jas which blocks keeps out + +181 +00:08:15.490 --> 00:08:18.450 +non-free javascript and sometimes + +182 +00:08:18.450 --> 00:08:21.780 +servers will offer to do your computing + +183 +00:08:21.780 --> 00:08:24.510 +they say send us all your data obviously + +184 +00:08:24.510 --> 00:08:25.800 +for suckers + +185 +00:08:25.800 --> 00:08:28.240 +then the server does the computing and + +186 +00:08:28.240 --> 00:08:30.550 +sends you back the results but you're + +187 +00:08:30.550 --> 00:08:32.130 +not supposed to think about what's + +188 +00:08:32.130 --> 00:08:34.920 +happening because it's a cloud and you + +189 +00:08:34.920 --> 00:08:37.380 +don't see what's going on + +190 +00:08:37.380 --> 00:08:38.860 +well you should look it's + +191 +00:08:38.860 --> 00:08:41.490 +software-as-a-service as a software + +192 +00:08:41.490 --> 00:08:44.290 +substitute and it takes away control of + +193 +00:08:44.290 --> 00:08:48.630 +your computing so a large fraction of + +194 +00:08:48.630 --> 00:08:51.330 +the world's web servers are running do / + +195 +00:08:51.330 --> 00:08:53.890 +lanoxin other free software but i think the + +196 +00:08:53.890 --> 00:08:55.450 +most important computers + +197 +00:08:55.450 --> 00:08:58.240 +to put freedom in our your computer's + +198 +00:08:58.240 --> 00:09:01.370 +not company's web servers they deserve + +199 +00:09:01.370 --> 00:09:04.690 +freedom also but above all its people + +200 +00:09:04.690 --> 00:09:07.570 +that deserve freedom so we need to + +201 +00:09:07.570 --> 00:09:11.290 +advance and to do that we have to cross + +202 +00:09:11.290 --> 00:09:13.930 +obstacles one of them is there are big + +203 +00:09:13.930 --> 00:09:15.700 +companies that make a lot of money by + +204 +00:09:15.700 --> 00:09:18.500 +having control over users and they don't + +205 +00:09:18.500 --> 00:09:20.500 +want to let us advance we have to + +206 +00:09:20.500 --> 00:09:22.750 +overcome their opposition + +207 +00:09:22.750 --> 00:09:25.240 +another is that the mainstream media + +208 +00:09:25.240 --> 00:09:27.820 +don't talk about free software they have + +209 +00:09:27.820 --> 00:09:30.860 +a term that they use to bury these + +210 +00:09:30.860 --> 00:09:33.680 +ethical issues they say open source + +211 +00:09:33.680 --> 00:09:35.930 +instead now + +212 +00:09:35.930 --> 00:09:37.870 +it talks about more or less the same + +213 +00:09:37.870 --> 00:09:41.620 +programs but with different ideas where + +214 +00:09:41.620 --> 00:09:44.590 +free software activists say this is a + +215 +00:09:44.590 --> 00:09:46.330 +matter of right and wrong users deserve + +216 +00:09:46.330 --> 00:09:48.760 +freedom we demand freedom the people say + +217 +00:09:48.760 --> 00:09:50.740 +open source data once say that + +218 +00:09:50.740 --> 00:09:53.830 +so instead they say let the users change + +219 +00:09:53.830 --> 00:09:55.970 +the software and redistribute it and + +220 +00:09:55.970 --> 00:09:58.180 +they'll make the code better they'll fix + +221 +00:09:58.180 --> 00:09:59.170 +some bugs + +222 +00:09:59.170 --> 00:10:01.900 +it may be true but it's a less important issue if + +223 +00:10:01.900 --> 00:10:03.190 +we want to keep our freedom + +224 +00:10:03.190 --> 00:10:05.260 +we've got to talk about freedom so say + +225 +00:10:05.260 --> 00:10:07.450 +free software and you're helping us + +226 +00:10:07.450 --> 00:10:09.880 +every time another obstacle is that lots + +227 +00:10:09.880 --> 00:10:12.820 +of schools teach non-free software which + +228 +00:10:12.820 --> 00:10:15.500 +is basically like teaching the kids to + +229 +00:10:15.500 --> 00:10:17.830 +smoke tobacco it's implanting dependence + +230 +00:10:17.830 --> 00:10:19.630 +which is the opposite of what school + +231 +00:10:19.630 --> 00:10:22.690 +should do a school should prepare + +232 +00:10:22.690 --> 00:10:27.110 +citizens to live in a strong capable + +233 +00:10:27.110 --> 00:10:30.110 +independent cooperating and free society + +234 +00:10:30.110 --> 00:10:33.520 +which means teaching free software in + +235 +00:10:33.520 --> 00:10:35.770 +the school but there's another reason to + +236 +00:10:35.770 --> 00:10:38.740 +do that for education some kids want to + +237 +00:10:38.740 --> 00:10:40.850 +become programmers they're curious they + +238 +00:10:40.850 --> 00:10:42.760 +wantto know how the programs work well + +239 +00:10:42.760 --> 00:10:44.120 +the one who's studying a free software + +240 +00:10:44.120 --> 00:10:46.550 +can understand it the one who's studying + +241 +00:10:46.550 --> 00:10:48.670 +a non-free program can't learn anything + +242 +00:10:48.670 --> 00:10:52.240 +because the knowledge in the non-free + +243 +00:10:52.240 --> 00:10:55.420 +program is withheld denied to the + +244 +00:10:55.420 --> 00:10:57.800 +students so to uphold the spirit of + +245 +00:10:57.800 --> 00:10:59.830 +Education the school should make sure + +246 +00:10:59.830 --> 00:11:01.870 +its programs are free but there's an + +247 +00:11:01.870 --> 00:11:04.540 +even more important reason schools + +248 +00:11:04.540 --> 00:11:06.880 +should teach the spirit of goodwill + +249 +00:11:06.880 --> 00:11:09.790 +the habit of helping other people so the + +250 +00:11:09.790 --> 00:11:12.370 +class should say if you bring a program + +251 +00:11:12.370 --> 00:11:14.950 +to class just as if you bring cookies to + +252 +00:11:14.950 --> 00:11:15.730 +class + +253 +00:11:15.730 --> 00:11:17.230 +you've got to share it with everyone + +254 +00:11:17.230 --> 00:11:19.870 +else can't keep it to yourself you gotta + +255 +00:11:19.870 --> 00:11:22.270 +share the source code so other people + +256 +00:11:22.270 --> 00:11:24.820 +can learn so don't bring any proprietary + +257 +00:11:24.820 --> 00:11:26.830 +software to this class + +258 +00:11:26.830 --> 00:11:29.920 +the school has to set a good example by + +259 +00:11:29.920 --> 00:11:32.740 +following its own rule should bring only + +260 +00:11:32.740 --> 00:11:35.620 +free software to class except as a + +261 +00:11:35.620 --> 00:11:39.700 +reverse engineering exercise another + +262 +00:11:39.700 --> 00:11:42.350 +obstacle is there's hardware we don't + +263 +00:11:42.350 --> 00:11:43.990 +know how to write free software for + +264 +00:11:43.990 --> 00:11:46.270 +because they won't tell us how to use + +265 +00:11:46.270 --> 00:11:48.850 +the hardware that shocking they want to + +266 +00:11:48.850 --> 00:11:51.100 +sell you the product and they won't tell + +267 +00:11:51.100 --> 00:11:52.300 +you how to use it + +268 +00:11:52.300 --> 00:11:54.820 +they say here's a non-free program you + +269 +00:11:54.820 --> 00:11:57.250 +can use run it and shut up + +270 +00:11:57.250 --> 00:12:00.910 +don't bother us well how do we find out + +271 +00:12:00.910 --> 00:12:02.770 +how to run that hardware with reverse + +272 +00:12:02.770 --> 00:12:05.890 +engineering you gotta study all those + +273 +00:12:05.890 --> 00:12:07.450 +zeroes and ones to figure out what they + +274 +00:12:07.450 --> 00:12:10.660 +really do and write down how to use that + +275 +00:12:10.660 --> 00:12:12.610 +hardware so someone else can write the + +276 +00:12:12.610 --> 00:12:15.730 +free program to do it it's hard work but + +277 +00:12:15.730 --> 00:12:17.620 +it can be done if you want to make a big + +278 +00:12:17.620 --> 00:12:19.990 +technical contribution that's what you + +279 +00:12:19.990 --> 00:12:24.130 +should do each new area activity of life + +280 +00:12:24.130 --> 00:12:27.520 +can bring with it new human rights that + +281 +00:12:27.520 --> 00:12:29.890 +are necessary and the human rights + +282 +00:12:29.890 --> 00:12:32.860 +depend on each other if you lose one it + +283 +00:12:32.860 --> 00:12:35.800 +becomes harder to maintain the others so + +284 +00:12:35.800 --> 00:12:38.830 +nowadays computing is so important in + +285 +00:12:38.830 --> 00:12:41.140 +society that the freedoms of free + +286 +00:12:41.140 --> 00:12:44.170 +software are among the human rights that + +287 +00:12:44.170 --> 00:12:47.290 +society must establish and protect us + +288 +00:12:47.290 --> 00:12:49.660 +how to help + +289 +00:12:49.660 --> 00:12:51.860 +well you can write free software you can + +290 +00:12:51.860 --> 00:12:55.540 +organize groups to campaign and persuade + +291 +00:12:55.540 --> 00:12:57.350 +schools and governments to move to free + +292 +00:12:57.350 --> 00:12:59.740 +software you can help other people when + +293 +00:12:59.740 --> 00:13:01.930 +they have trouble using free software or + +294 +00:13:01.930 --> 00:13:05.170 +help them install it you can say free + +295 +00:13:05.170 --> 00:13:06.980 +software and spread the philosophical + +296 +00:13:06.980 --> 00:13:10.900 +ideas moving to free software is the + +297 +00:13:10.900 --> 00:13:13.270 +first step in the liberation of cyberspace + +298 +00:13:13.270 --> 00:13:15.160 +but of course we also use the internet + +299 +00:13:15.160 --> 00:13:17.200 +we need other freedoms they're like + +300 +00:13:17.200 --> 00:13:19.400 +network neutrality and + +301 +00:13:19.400 --> 00:13:22.910 +putting an end to surveillance of people + +302 +00:13:22.910 --> 00:13:24.640 +in general diff --git a/content/wp-content/uploads/pages/subtitles/2017/03/portuguese.vtt b/content/wp-content/uploads/pages/subtitles/2017/03/portuguese.vtt new file mode 100644 index 0000000..458da55 --- /dev/null +++ b/content/wp-content/uploads/pages/subtitles/2017/03/portuguese.vtt @@ -0,0 +1,1103 @@ +WEBVTT + +1 +00:00:10.943 --> 00:00:17.986 +O software livre é a primeira batalha +na liberação do ciberespaço. + +2 +00:00:17.986 --> 00:00:20.318 +Quem controla o seu computador? + +3 +00:00:20.318 --> 00:00:25.902 +É você ou alguma grande empresa +que realmente o controla? + +4 +00:00:25.902 --> 00:00:27.997 +O que é um computador? + +5 +00:00:27.997 --> 00:00:31.144 +Um computador é uma máquina universal. + +6 +00:00:31.664 --> 00:00:35.172 +Ele vai computar qualquer coisa +que você quiser + +7 +00:00:35.172 --> 00:00:37.285 +porque você dá a ele um programa que diz + +8 +00:00:37.285 --> 00:00:40.287 +o que deverá ser computado. + +9 +00:00:40.287 --> 00:00:44.600 +O computador só sabe +como conseguir instruções e executá-las, + +10 +00:00:44.600 --> 00:00:46.522 +e conseguir mais instruções e executá-las. + +11 +00:00:46.522 --> 00:00:50.591 +O programa tem as instruções, +ele diz o que fazer. + +12 +00:00:50.591 --> 00:00:55.256 +Criando o programa certo, +você deixa ele fazer de tudo. + +13 +00:00:55.256 --> 00:00:56.824 +Bem, quase tudo. + +14 +00:00:58.140 --> 00:01:00.853 +Que dá as instruções ao seu computador? + +15 +00:01:00.853 --> 00:01:04.495 +Você pode pensar que ele está +obedecendo suas instruções + +16 +00:01:04.495 --> 00:01:07.777 +quando ele está obedecendo +outra pessoa primeiro, + +17 +00:01:07.778 --> 00:01:13.624 +e a você somente na medida +em que a empresa escutá-lo. + +18 +00:01:14.224 --> 00:01:16.256 +Com software, há duas possibilidades: + +19 +00:01:16.256 --> 00:01:21.747 +Ou os usuários controlam o programa, +ou acontece o contrário. + +20 +00:01:21.747 --> 00:01:24.119 +É um ou outro, inevitavelmente. + +21 +00:01:24.119 --> 00:01:27.329 +Para que os usuários controlem o programa, + +22 +00:01:27.329 --> 00:01:30.308 +eles precisam das quatro +liberdades essenciais. + +23 +00:01:31.118 --> 00:01:34.698 +Essa é a definição de um software livre. + +24 +00:01:34.698 --> 00:01:38.583 +O software livre respeita a liberdade +do usuário e da comunidade. + +25 +00:01:38.583 --> 00:01:43.874 +Geralmente o chamamos "libre", +usando a palavra em francês ou espanhol. + +26 +00:01:43.874 --> 00:01:45.988 +De qualquer forma, +é isso que queremos dizer. + +27 +00:01:45.989 --> 00:01:48.925 +Não queremos dizer que é grátis, +não se trata de preço. + +28 +00:01:48.925 --> 00:01:51.217 +Estamos preocupados com a sua liberdade, + +29 +00:01:51.217 --> 00:01:55.250 +e, às vezes, dizemos "libre/livre" +para mostrar isso. + +30 +00:01:55.250 --> 00:01:58.475 +Liberdade zero é a liberdade +para utilizar o programa + +31 +00:01:58.475 --> 00:02:01.270 +como você desejar +e para qualquer propósito. + +32 +00:02:01.270 --> 00:02:05.310 +Liberdade um é a que permite o estudo +do código-fonte do programa + +33 +00:02:05.320 --> 00:02:10.269 +e poder mudá-lo, +para computar o que você quiser. + +34 +00:02:10.270 --> 00:02:11.752 +Mas o que é o código-fonte? + +35 +00:02:11.752 --> 00:02:14.787 +Os programas normalmente +terão duas formas. + +36 +00:02:14.787 --> 00:02:17.367 +Uma forma que você pode ler, + +37 +00:02:17.367 --> 00:02:20.680 +e entender se você sabe +a linguagem de programação. + +38 +00:02:20.681 --> 00:02:22.306 +Esta é a fonte. + +39 +00:02:22.306 --> 00:02:24.708 +É isso que os programadores +escrevem e mudam. + +40 +00:02:24.708 --> 00:02:27.250 +Há também a executável, +que é um monte de números + +41 +00:02:27.250 --> 00:02:29.914 +que até um programador não entende. + +42 +00:02:29.914 --> 00:02:31.801 +Se você só tem o executável, + +43 +00:02:31.801 --> 00:02:35.117 +é um trabalho enorme +descobrir o que ele faz, + +44 +00:02:35.117 --> 00:02:37.240 +e é ainda mais difícil mudá-lo. + +45 +00:02:37.240 --> 00:02:41.137 +Então, para se ter a possibilidade +real de estudá-lo e mudá-loa, + +46 +00:02:41.137 --> 00:02:43.322 +é necessário que lhe deem +o código-fonte. + +47 +00:02:43.322 --> 00:02:44.919 +Isto é um requisito essencial. + +48 +00:02:44.919 --> 00:02:47.456 +Com essas duas liberdades, + +49 +00:02:47.456 --> 00:02:50.588 +cada usuário, separadamente, +pode fazer uma cópia + +50 +00:02:50.588 --> 00:02:54.317 +e começar a mudá-la +para que ele faça o que ele quer. + +51 +00:02:54.317 --> 00:02:56.986 +Isto é o controle individual. + +52 +00:02:56.986 --> 00:02:59.224 +Mas e se você não for um programador? + +53 +00:02:59.224 --> 00:03:02.180 +Você olha para o código-fonte +e não o entende. + +54 +00:03:02.190 --> 00:03:04.791 +Controle individual não é o suficiente. + +55 +00:03:04.791 --> 00:03:07.720 +Também precisamos de controle coletivo, + +56 +00:03:07.720 --> 00:03:09.851 +que quer dizer que qualquer grupo +de usuários tem liberdade + +57 +00:03:09.851 --> 00:03:13.216 +para unir esforços e adaptar o programa +para fazer o que eles quiserem. + +58 +00:03:13.216 --> 00:03:16.192 +Claro que, no grupo, +alguns deles são programadores. + +59 +00:03:16.192 --> 00:03:18.890 +Eles são os que escrevem as modificações, + +60 +00:03:18.890 --> 00:03:22.757 +mas fazem isso como parte do grupo +e para o propósito dele. + +61 +00:03:22.758 --> 00:03:25.312 +Claro que o grupo não +tem que ser todo mundo. + +62 +00:03:25.312 --> 00:03:28.390 +Outros podem utilizá-lo +de algum outro modo. + +63 +00:03:28.390 --> 00:03:29.690 +Todos estão livres para fazê-lo. + +64 +00:03:29.691 --> 00:03:33.717 +Controle coletivo requer +mais duas liberdades essenciais. + +65 +00:03:33.717 --> 00:03:37.154 +A liberdade dois é a que permite +redistribuir cópias idênticas, + +66 +00:03:37.154 --> 00:03:41.190 +fazer as cópias e distribuí-las +ou vendê-las se preferir. + +67 +00:03:41.190 --> 00:03:45.486 +A liberdade três é parecida, +mas é para versões modificadas. + +68 +00:03:45.486 --> 00:03:49.387 +Você pode fazer cópias, e então +distribuí-las ou vendê-las se quiser. + +69 +00:03:49.387 --> 00:03:52.447 +Se você tem essas liberdades, +então o software é livre, + +70 +00:03:52.447 --> 00:03:54.525 +e os usuários controlam o programa. + +71 +00:03:54.525 --> 00:03:59.523 +Mas se alguma delas falta, +os usuários não controlam o programa. + +72 +00:03:59.523 --> 00:04:05.329 +Nesse caso o programa controla o usuário +e o desenvolvedor controla o programa. + +73 +00:04:05.330 --> 00:04:10.768 +Isso quer dizer que o programa +é um instrumento de poder injusto + +74 +00:04:10.768 --> 00:04:14.783 +para seu desenvolvedor sobre os usuários. + +75 +00:04:14.783 --> 00:04:17.620 +Quer dizer que os usuários +não têm liberdade, + +76 +00:04:17.620 --> 00:04:22.910 +que é software particular e privado, +e temos que nos livrar dele. + +77 +00:04:22.910 --> 00:04:25.488 +O que acontece quando +se tem um software privado? + +78 +00:04:25.488 --> 00:04:29.390 +Às vezes, o programa bisbilhota o usuário. + +79 +00:04:29.390 --> 00:04:32.498 +Às vezes, ele rastreia o usuário. + +80 +00:04:32.498 --> 00:04:35.522 +Às vezes, restringe o usuário, + +81 +00:04:35.522 --> 00:04:38.320 +e o impede de fazer o que ele quer fazer. + +82 +00:04:38.321 --> 00:04:41.199 +Veja que o "Blu-ray" é seu inimigo. + +83 +00:04:41.199 --> 00:04:42.331 +(Risos) + +84 +00:04:42.331 --> 00:04:46.146 +Às vezes, o software deleta +livros remotamente + +85 +00:04:46.146 --> 00:04:49.356 +como a Amazon fez com o "1984". + +86 +00:04:49.356 --> 00:04:54.947 +Às vezes, o desenvolvedor +força os usuários + +87 +00:04:54.947 --> 00:04:58.658 +a instalar uma atualização prejudicial, + +88 +00:04:58.658 --> 00:05:01.191 +ameaçando remover uma outra função + +89 +00:05:01.191 --> 00:05:04.943 +se não for feita a instalação, +como a Sony fez. + +90 +00:05:04.944 --> 00:05:09.661 +Às vezes, ele até mudam +o software à distância + +91 +00:05:09.661 --> 00:05:14.885 +como a Microsoft faz com o Windows +pela porta dos fundos universal. + +92 +00:05:14.885 --> 00:05:18.489 +Às vezes ele sabotam os usuários, + +93 +00:05:18.489 --> 00:05:22.792 +como a Microsoft faz quando reporta +os bugs no Windows à NSA, + +94 +00:05:22.792 --> 00:05:27.323 +para que ela usar isto para atacar +os computadores das pessoas. + +95 +00:05:27.323 --> 00:05:30.969 +A verdade é que com software proprietário, + +96 +00:05:30.969 --> 00:05:33.724 +o dono tem poder sobre os usuários, + +97 +00:05:33.724 --> 00:05:36.233 +e tira vantagem desse poder, + +98 +00:05:36.233 --> 00:05:40.850 +incluindo todas aquelas +funcionalidades maliciosas + +99 +00:05:40.850 --> 00:05:42.251 +para prejudicar os usuários. + +100 +00:05:42.252 --> 00:05:45.480 +Claro que não fazem isso +porque são sádicos, + +101 +00:05:45.480 --> 00:05:47.918 +só o fazem por dinheiro e ganância. + +102 +00:05:47.918 --> 00:05:53.872 +Há muitas formas de lucrarem +com este poder sobre os usuários, + +103 +00:05:53.872 --> 00:05:58.584 +o que não o faz nem um +pouco menos prejudicial. + +104 +00:05:58.584 --> 00:06:00.420 +Mas eles não se envergonham disso. + +105 +00:06:00.420 --> 00:06:04.252 +Têm conferências em que falam +das formas mais modernas + +106 +00:06:04.252 --> 00:06:08.457 +de tirar vantagem dos usuários +usando o poder que têm. + +107 +00:06:08.457 --> 00:06:11.349 +Basicamente, no software proprietário, + +108 +00:06:11.350 --> 00:06:16.300 +o que acontece com quase todos +os seus usuários, + +109 +00:06:16.300 --> 00:06:19.510 +é que eles estão usando +malware proprietário. + +110 +00:06:19.520 --> 00:06:21.253 +É o "software para idiotas". + +111 +00:06:21.253 --> 00:06:25.114 +Como você deixa de ser a vítima? + +112 +00:06:25.114 --> 00:06:29.190 +Antes, você tinha que parar +de usar computadores, mas agora não. + +113 +00:06:29.190 --> 00:06:33.615 +Agora, você poder se juntar a nós +no mundo livre que criamos. + +114 +00:06:33.615 --> 00:06:37.870 +Em 1983, anunciei que eu ia desenvolver + +115 +00:06:37.870 --> 00:06:42.860 +um software de sistema operacional +totalmente livre chamado GNU. + +116 +00:06:42.860 --> 00:06:45.589 +Em 1992, o tínhamos quase acabado, + +117 +00:06:45.589 --> 00:06:48.353 +mas faltava uma peça, o kernel. + +118 +00:06:48.353 --> 00:06:52.690 +Linus Torvalds, naquele ano, +liberou seu kernel, o Linux, + +119 +00:06:52.690 --> 00:06:54.824 +o que preencheu a última +lacuna e nos deu + +120 +00:06:54.824 --> 00:07:00.316 +o primeiro sistema completo que +você poderia rodar num PC: o GNU/Linux. + +121 +00:07:00.316 --> 00:07:07.349 +Infelizmente, ter liberdade uma vez +não garante que você vai mantê-la. + +122 +00:07:07.350 --> 00:07:11.658 +Há mais de mil variantes do GNU/Linux. + +123 +00:07:11.658 --> 00:07:13.577 +Se chamam distribuições. + +124 +00:07:13.577 --> 00:07:16.336 +Algumas são software totalmente livre, + +125 +00:07:16.336 --> 00:07:19.289 +a maioria tem software +não-livre adicionado, + +126 +00:07:19.289 --> 00:07:23.240 +porque são mantidas por pessoas +que não liga para liberdade. + +127 +00:07:23.240 --> 00:07:27.900 +Preferem adicionar conveniência +às custas da liberdade. + +128 +00:07:27.900 --> 00:07:30.938 +Então você tem que conferir, +qual é uma distribuição grátis. + +129 +00:07:30.938 --> 00:07:34.500 +Para manter sua liberdade, +às vezes você precisa de um sacrifício, + +130 +00:07:34.500 --> 00:07:38.190 +que pode ser grande, como na Lexington. + +131 +00:07:38.190 --> 00:07:44.220 +os da nossa campanha são, +geralmente, sacrifícios pequenos. + +132 +00:07:44.220 --> 00:07:48.516 +Qualquer um com um pouco de maturidade +pode fazer esses sacrifícios. + +133 +00:07:48.516 --> 00:07:52.890 +Por exemplo, você quer aplicações, +mas a maioria não é de graça. + +134 +00:07:52.890 --> 00:07:55.623 +Se você quer liberdade, +tem que viver sem elas. + +135 +00:07:55.624 --> 00:07:58.293 +Pode haver algumas inconveniências + +136 +00:07:58.293 --> 00:08:01.661 +que você sofrerá por causa +da sua liberdade. + +137 +00:08:01.661 --> 00:08:06.320 +Muitos websites mandam +programas não-livres, + +138 +00:08:06.320 --> 00:08:09.100 +escritos em JavaScript, +para o navegador do usuário. + +139 +00:08:09.100 --> 00:08:11.288 +Se você não quer executar +programas não-livres, + +140 +00:08:11.288 --> 00:08:14.850 +deve instalar o LibreJS, + +141 +00:08:14.850 --> 00:08:17.882 +que bloqueia e mantêm +JavaScript não-livre de fora. + +142 +00:08:17.882 --> 00:08:22.557 +Às vezes, os servidores se oferecem +para computar seus dados. + +143 +00:08:22.557 --> 00:08:24.590 +Dizem: "Envie-nos seus dados." + +144 +00:08:24.590 --> 00:08:26.349 +Para idiotas, obviamente. + +145 +00:08:26.349 --> 00:08:30.483 +Então o servidor faz a computação, +e te envia de volta os dados. + +146 +00:08:30.483 --> 00:08:33.115 +Mas você não deve pensar +sobre o que está acontecendo, + +147 +00:08:33.115 --> 00:08:37.640 +porque é uma "nuvem", e você +não vê o que está se passando. + +148 +00:08:37.640 --> 00:08:39.253 +Bom, você deveria dar uma olhada. + +149 +00:08:39.253 --> 00:08:41.787 +É um serviço que substitui o software, + +150 +00:08:41.787 --> 00:08:46.151 +e toma o controle do seu computador. + +151 +00:08:46.151 --> 00:08:50.224 +Grande parte dos servidores da internet + +152 +00:08:50.225 --> 00:08:53.290 +está rodando GNU/Linux +e outros softwares livres. + +153 +00:08:53.290 --> 00:08:57.706 +Mas acho que os principais computadores +a terem liberdade devem ser + +154 +00:08:57.706 --> 00:09:01.210 +os seus computadores, +e não servidores empresariais. + +155 +00:09:01.210 --> 00:09:02.824 +Eles também merecem liberdade. + +156 +00:09:02.824 --> 00:09:06.117 +Mas acima de tudo, são as pessoas +que merecem liberdade. + +157 +00:09:06.118 --> 00:09:09.620 +Por isso precisamos avançar, + +158 +00:09:09.620 --> 00:09:12.618 +e para isso temos que superar obstáculos. + +159 +00:09:12.618 --> 00:09:14.861 +Um deles é que há grandes empresas + +160 +00:09:14.861 --> 00:09:17.915 +que ganham muito dinheiro +controlando os usuários. + +161 +00:09:17.916 --> 00:09:20.119 +Elas não querem que avancemos. + +162 +00:09:20.119 --> 00:09:23.117 +Temos de superar esta oposição. + +163 +00:09:23.117 --> 00:09:27.454 +Outro é que a grande mídia +não fala sobre software livre. + +164 +00:09:27.454 --> 00:09:32.587 +Eles usam um termo +para enterrar estar questões éticas. + +165 +00:09:32.587 --> 00:09:35.391 +Eles chamam de "Código Aberto". + +166 +00:09:35.391 --> 00:09:39.589 +Isso se trata mais ou menos +dos mesmos programas, + +167 +00:09:39.589 --> 00:09:41.615 +mas com ideias diferentes. + +168 +00:09:41.615 --> 00:09:43.884 +Quando os ativistas de +software livre dizem: + +169 +00:09:43.884 --> 00:09:45.891 +"Esta é uma questão de certo e errado. + +170 +00:09:45.891 --> 00:09:47.998 +Usuários merecem liberdade, a exigimos." + +171 +00:09:47.999 --> 00:09:50.982 +As pessoas que dizem "código aberto" +não querem dizer o mesmo. + +172 +00:09:50.982 --> 00:09:52.382 +Em vez disso dizem: + +173 +00:09:52.382 --> 00:09:56.151 +"Os usuários podem modificar +e redistribuir o software, + +174 +00:09:56.152 --> 00:09:58.910 +e eles melhorarão o código." + +175 +00:09:58.910 --> 00:09:59.440 +Vão consertar alguns bugs. + +176 +00:09:59.480 --> 00:10:01.947 +Talvez seja verdade, +mas isso não é tão importante. + +177 +00:10:01.947 --> 00:10:05.810 +Se queremos manter nossa liberdade, +temos que falar de liberdade. + +178 +00:10:05.810 --> 00:10:08.652 +Então diga "software livre" +e você estará nos ajudando sempre. + +179 +00:10:08.652 --> 00:10:12.873 +Outro obstáculo é que muitas escolas +ensinam os softwares não-livres, + +180 +00:10:12.873 --> 00:10:16.455 +que é basicamente o mesmo +que ensinar crianças a fumar. + +181 +00:10:16.455 --> 00:10:18.382 +É uma implantação de dependência, + +182 +00:10:18.382 --> 00:10:20.722 +o oposto do que escolas deveriam fazer. + +183 +00:10:20.722 --> 00:10:24.730 +Uma escola deveria preparar +os cidadãos para viverem + +184 +00:10:24.730 --> 00:10:31.810 +numa sociedade forte, capaz, +independente, cooperativa e livre, + +185 +00:10:31.810 --> 00:10:34.689 +o que significa que deveriam +ensinar software livre nas escolas. + +186 +00:10:34.689 --> 00:10:37.623 +Mas há outra razão +para fazer isso pela educação. + +187 +00:10:37.624 --> 00:10:40.691 +Algumas crianças querem ser +programadoras, são curiosas. + +188 +00:10:40.691 --> 00:10:42.785 +Querem saber como os programas funcionam. + +189 +00:10:42.785 --> 00:10:45.911 +Enquanto uma que estuda +software livre consegue entendê-lo, + +190 +00:10:45.912 --> 00:10:49.452 +a que estuda um programa +não livre não aprende nada, + +191 +00:10:49.452 --> 00:10:53.316 +porque o conhecimento no +programa não-livre + +192 +00:10:53.316 --> 00:10:56.683 +é mantido escondido, negado aos alunos. + +193 +00:10:56.683 --> 00:10:59.230 +Assim para apoiar o espírito da educação, + +194 +00:10:59.230 --> 00:11:01.756 +a escola deveria assegurar +que os programas sejam livres. + +195 +00:11:01.756 --> 00:11:03.745 +Há uma razão ainda mais importante: + +196 +00:11:03.745 --> 00:11:07.187 +Escolas deveriam ensinar +o espírito da boa-vontade, + +197 +00:11:07.187 --> 00:11:09.520 +o hábito de ajudar os outros. + +198 +00:11:09.520 --> 00:11:11.322 +A aula deveria dizer: + +199 +00:11:11.322 --> 00:11:13.726 +"Se você trouxer um programa para a aula, + +200 +00:11:13.726 --> 00:11:15.882 +do mesmo modo que acontece com biscoitos, + +201 +00:11:15.882 --> 00:11:18.287 +você terá que compartilhar com os outros. + +202 +00:11:18.288 --> 00:11:19.785 +Não poderá ficar com tudo. + +203 +00:11:19.785 --> 00:11:23.824 +Terá que compartilhar o código-fonte, +para que os outros aprendam. + +204 +00:11:23.824 --> 00:11:27.830 +Então não traga um software +proprietário para a aula." + +205 +00:11:27.830 --> 00:11:32.890 +A escola tem que dar um bom exemplo +seguindo a própria regra: + +206 +00:11:32.890 --> 00:11:34.782 +só se pode trazer software +livre para a aula, + +207 +00:11:34.782 --> 00:11:39.534 +com exceção de um exercício +de engenharia reversa. + +208 +00:11:39.534 --> 00:11:41.949 +Outro obstáculo é que existem hardwares + +209 +00:11:41.949 --> 00:11:44.846 +para os quais não sabemos criar softwares, + +210 +00:11:44.846 --> 00:11:47.622 +porque não nos dizem +como se usa o hardware. + +211 +00:11:47.622 --> 00:11:50.387 +Isso é chocante. Querem +te vender o produto, + +212 +00:11:50.388 --> 00:11:52.489 +mas não te ensinam a usá-lo. + +213 +00:11:52.489 --> 00:11:55.950 +Dizem: "Aqui está um programa +não livre que você pode usar. + +214 +00:11:55.950 --> 00:11:59.583 +Use-o, e fique calado. Não nos incomode." + +215 +00:11:59.583 --> 00:12:04.820 +Como descobrimos como se usa o hardware +com a engenharia reversa? + +216 +00:12:04.820 --> 00:12:08.681 +Estude todos os zeros e uns para +descobrir o que eles realmente fazem, + +217 +00:12:08.681 --> 00:12:11.590 +e escreva como se usa este hardware, + +218 +00:12:11.590 --> 00:12:14.482 +para que outra pessoa possa +escrever o programa que o faça. + +219 +00:12:14.482 --> 00:12:16.925 +É difícil, mas pode ser feito, + +220 +00:12:16.926 --> 00:12:19.455 +se você quiser fazer uma grande +contribuição técnica, + +221 +00:12:19.455 --> 00:12:21.515 +é isso que deve fazer. + +222 +00:12:21.515 --> 00:12:24.786 +Cada área nova, ou atividade na vida, + +223 +00:12:24.786 --> 00:12:29.890 +pode trazer junto novos +e necessários direitos humanos . + +224 +00:12:29.890 --> 00:12:31.518 +Os direitos humanos dependem um do outro. + +225 +00:12:31.518 --> 00:12:35.711 +Se você perder um, +é mais difícil manter os outros. + +226 +00:12:35.711 --> 00:12:39.854 +Então hoje, a computação +é tão importante na sociedade + +227 +00:12:39.854 --> 00:12:44.214 +que as liberdades do software livre +estão entre os direitos humanos + +228 +00:12:44.214 --> 00:12:47.322 +que a sociedade deve +estabelecer e proteger. + +229 +00:12:47.322 --> 00:12:49.908 +Assim, como ajudar? + +230 +00:12:49.908 --> 00:12:51.918 +Você pode criar software livre. + +231 +00:12:51.918 --> 00:12:54.616 +Pode organizar grupos +para fazer campanhas, + +232 +00:12:54.616 --> 00:12:58.285 +e persuadir escolas e governos +a mudar para softwares livres. + +233 +00:12:58.285 --> 00:13:01.951 +Você pode ajudar os outros quando +tiverem problemas usando software livre, + +234 +00:13:01.951 --> 00:13:03.849 +ou ajudá-los a instalá-lo. + +235 +00:13:03.849 --> 00:13:08.713 +Pode dizer "software livre", +e espalhar as ideias filosóficas. + +236 +00:13:08.713 --> 00:13:11.391 +A transição para o software livre +é o primeiro passo + +237 +00:13:11.391 --> 00:13:15.670 +na liberação do ciberespaço, +mas claro que também usamos a internet. + +238 +00:13:15.671 --> 00:13:17.551 +Precisamos de outras liberdades nela, + +239 +00:13:17.551 --> 00:13:20.850 +como a neutralidade da rede, e pôr um fim + +240 +00:13:20.850 --> 00:13:25.167 +na espionagem das pessoas em geral. + +241 +00:13:25.167 --> 00:13:33.510 +(Aplausos) + diff --git a/content/wp-content/uploads/pages/subtitles/2017/03/spanish.vtt b/content/wp-content/uploads/pages/subtitles/2017/03/spanish.vtt new file mode 100644 index 0000000..bb6e0c8 --- /dev/null +++ b/content/wp-content/uploads/pages/subtitles/2017/03/spanish.vtt @@ -0,0 +1,1130 @@ +WEBVTT + +1 +00:00:11.120 --> 00:00:15.140 +El software libre es la primera batalla + +2 +00:00:15.140 --> 00:00:18.160 +en la liberación del ciberespacio. + +3 +00:00:18.160 --> 00:00:20.220 +¿Quién controla tu computadora? + +4 +00:00:20.240 --> 00:00:25.670 +¿Eres tú o es una gran compañía +quién realmente la controla? + +5 +00:00:25.770 --> 00:00:27.780 +¿Qué es una computadora? + +6 +00:00:27.790 --> 00:00:31.850 +Una computadora es +una máquina universal. + +7 +00:00:31.870 --> 00:00:35.120 +Ejecutará cualquier cosa que pidas + +8 +00:00:35.120 --> 00:00:37.400 +porque le diste un programa que ordena + +9 +00:00:37.430 --> 00:00:40.160 +que es lo que quieres que ejecute. + +10 +00:00:40.170 --> 00:00:43.980 +La computadora solo sabe +como recibir una instrucción y ejecutarla, + +11 +00:00:43.990 --> 00:00:46.350 +recibir otra instrucción y ejecutarla. + +12 +00:00:46.350 --> 00:00:50.550 +El programa tiene las instrucciones +que dicen qué hacer. + +13 +00:00:50.610 --> 00:00:55.250 +Escribiendo el programa adecuado, +puedes conseguir cualquier cosa. + +14 +00:00:55.250 --> 00:00:57.660 +O al menos casi todo. + +15 +00:00:57.670 --> 00:01:00.690 +¿Quién da las instrucciones a +tu computadora? + +16 +00:01:00.720 --> 00:01:04.320 +Puedes pensar que obedece tus ordenes + +17 +00:01:04.350 --> 00:01:07.490 +cuando realmente obedece +a alguien más primero, + +18 +00:01:07.550 --> 00:01:13.950 +y tú solo puedes ser escuchado hasta +donde la compañía te permita. + +19 +00:01:13.990 --> 00:01:16.490 +Con el software, +hay dos posibilidades: + +20 +00:01:16.930 --> 00:01:21.490 +Cualquiera de los usuarios controla +el programa o este los controla a ellos. + +21 +00:01:21.490 --> 00:01:23.840 +Es inevitable una u otra. + +22 +00:01:23.890 --> 00:01:27.130 +Para que los usuarios puedan controlar el programa, + +23 +00:01:27.130 --> 00:01:30.920 +ellos necesitan cuatro libertades esenciales. + +24 +00:01:30.920 --> 00:01:34.400 +Esta es la definición de software libre. + +25 +00:01:34.430 --> 00:01:38.350 +El software libre respeta la libertad +de los usuarios y de la comunidad. + +26 +00:01:38.360 --> 00:01:42.390 +Frecuentemente los llamamos "Libre" +utilizando la palabra Francesa o Española. + +27 +00:01:42.400 --> 00:01:45.710 +Pronunciado como quieran, +la cuestión es qué es lo que significa. + +28 +00:01:45.730 --> 00:01:48.790 +No queremos decir que es gratis, +no hablamos sobre el precio. + +29 +00:01:48.790 --> 00:01:51.380 +Estamos preocupados por la libertad, + +30 +00:01:51.450 --> 00:01:55.550 +y a veces decimos +"Free/Libre" para demostrarlo. + +31 +00:01:55.570 --> 00:01:58.470 +La libertad número 0 +es la de utilizar el programa + +32 +00:01:58.500 --> 00:02:01.230 +como quieras +para cualquier propósito. + +33 +00:02:01.230 --> 00:02:05.350 +La libertad número 1 es la de estudiar +el código fuente del programa + +34 +00:02:05.370 --> 00:02:09.710 +y cambiarlo, para que así +se ejecute la orden que quieras. + +35 +00:02:09.730 --> 00:02:11.440 +Pero, ¿qué es el código fuente? + +36 +00:02:11.460 --> 00:02:14.570 +Normalmente cada programa +tiene dos formas. + +37 +00:02:14.630 --> 00:02:18.390 +Hay una forma que puedes leer y entender + +38 +00:02:18.400 --> 00:02:20.480 +si conoces el lenguaje de programación. + +39 +00:02:20.520 --> 00:02:21.920 +Ese es el código fuente. + +40 +00:02:21.940 --> 00:02:24.320 +Es lo que los programadores +escriben y cambian. + +41 +00:02:24.340 --> 00:02:27.220 +Luego, hay un ejecutable, que es +un banco de números + +42 +00:02:27.220 --> 00:02:29.580 +que incluso un programador +no puede entender. + +43 +00:02:29.600 --> 00:02:31.580 +Si todo lo que tienes es el ejecutable, + +44 +00:02:31.590 --> 00:02:34.980 +podría ser un horroroso dolor de cabeza +imaginarse qué es lo que hace, + +45 +00:02:34.990 --> 00:02:36.860 +e incluso más difícil de cambiar. + +46 +00:02:36.870 --> 00:02:41.690 +Por lo que para tener la posibilidad real +de estudiarlo y cambiarlo, + +47 +00:02:41.690 --> 00:02:42.940 +tienen que darte el código fuente. + +48 +00:02:42.950 --> 00:02:44.620 +Es un requisito indispensable. + +49 +00:02:44.620 --> 00:02:47.450 +Con estas dos libertades, + +50 +00:02:47.460 --> 00:02:50.300 +cada usuario puede hacer una copia +por separado, + +51 +00:02:50.320 --> 00:02:54.100 +empezar a cambiarlo y hacer que ejecute la orden que quieran. + +52 +00:02:54.100 --> 00:02:56.740 +Eso es control individual. + +53 +00:02:56.750 --> 00:02:58.910 +Pero, ¿qué ocurre sino eres programador? + +54 +00:02:58.920 --> 00:03:01.700 +Cuando miras el código fuente +no puedes entenderlo. + +55 +00:03:01.740 --> 00:03:04.780 +El control individual no es suficiente. + +56 +00:03:04.790 --> 00:03:06.960 +También necesitamos un control colectivo, + +57 +00:03:06.970 --> 00:03:10.360 +significa que cualquier grupo +de usuarios es libre de trabajar juntos + +58 +00:03:10.370 --> 00:03:12.910 +para adaptar el programa a lo que quieran. + +59 +00:03:12.920 --> 00:03:16.260 +Por supuesto, algunos +serán programadores. + +60 +00:03:16.490 --> 00:03:18.720 +Son quienes realmente +escriben los cambios, + +61 +00:03:18.720 --> 00:03:20.830 +pero lo hacen como parte del grupo + +62 +00:03:20.850 --> 00:03:22.600 +para lo que el grupo quiere. + +63 +00:03:22.620 --> 00:03:25.380 +Por supuesto, el grupo no tiene +por que ser todo el mundo. + +64 +00:03:25.400 --> 00:03:27.580 +Otros pueden usarlo de otra forma. + +65 +00:03:27.580 --> 00:03:30.130 +Todos son libres para hacer eso. + +66 +00:03:30.140 --> 00:03:33.500 +El control colectivo requiere dos +libertades esenciales más. + +67 +00:03:33.500 --> 00:03:36.970 +La libertad número 2 +es la de redistribuir copias exactas, + +68 +00:03:36.970 --> 00:03:38.920 +hacer copias y redistribuirlas + +69 +00:03:38.940 --> 00:03:41.260 +o venderlas cuando quieras. + +70 +00:03:41.590 --> 00:03:43.120 +La libertad número 3 es similar, + +71 +00:03:43.350 --> 00:03:45.270 +pero es para tus versiones modificadas. + +72 +00:03:45.300 --> 00:03:49.170 +Puedes hacer copias y redistribuirlas +o venderlas cuando quieras. + +73 +00:03:49.240 --> 00:03:52.200 +Si realmente tienes estas libertades, +el software es libre, + +74 +00:03:52.210 --> 00:03:54.130 +los usuarios controlan el programa. + +75 +00:03:54.130 --> 00:03:56.780 +Pero si una de estas libertades no existe, + +76 +00:03:56.810 --> 00:03:59.530 +entonces los usuarios no controlan +al programa. + +77 +00:03:59.530 --> 00:04:05.580 +En cambio, el programa los controla +a ellos y el desarrollador al programa. + +78 +00:04:05.590 --> 00:04:10.630 +Eso significa que este programa es +un instrumento de un poder injusto + +79 +00:04:10.680 --> 00:04:14.530 +del desarrollador sobre los usuarios. + +80 +00:04:14.560 --> 00:04:17.500 +Significa que los usuarios +no tienen libertad, + +81 +00:04:17.560 --> 00:04:21.790 +eso no es libre, y es por eso tenemos +que eliminar el software privativo. + +82 +00:04:21.820 --> 00:04:25.260 +¿Qué ocurre cuando tienes software +privativo? + +83 +00:04:25.270 --> 00:04:29.100 +A veces el programa fisgonea al usuario. + +84 +00:04:29.150 --> 00:04:32.210 +A veces rastrea al usuario. + +85 +00:04:32.280 --> 00:04:35.230 +A veces restringe al usuario, + +86 +00:04:35.260 --> 00:04:38.170 +e impide a los usuarios hacer +lo que quieren hacer. + +87 +00:04:38.190 --> 00:04:41.290 +Como ven el rayo azul es su enemigo. + +88 +00:04:41.310 --> 00:04:42.340 +(Risas) + +89 +00:04:42.360 --> 00:04:45.990 +A veces el software borra los libros +remotamente + +90 +00:04:46.270 --> 00:04:49.110 +tal y como Amazon hizo con +"Mil novecientos ochenta y cuatro" + +91 +00:04:49.130 --> 00:04:54.760 +A veces el desarrollador fuerza al usuario + +92 +00:04:54.840 --> 00:04:58.400 +a instalar una actualización perjudicial, + +93 +00:04:58.420 --> 00:05:01.520 +amenazando con eliminar alguna +otra funcionalidad + +94 +00:05:01.550 --> 00:05:04.660 +si no se instala, como lo hizo +Sony. + +95 +00:05:04.690 --> 00:05:09.440 +Pueden incluso cambiar por la fuerza +el software a distancia + +96 +00:05:09.440 --> 00:05:14.630 +como Microsoft puede con Windows +mediante la puerta trasera universal. + +97 +00:05:14.670 --> 00:05:18.170 +Incluso pueden sabotear a los usuarios, + +98 +00:05:18.210 --> 00:05:23.370 +como Microsoft cuando le cuenta a +la NSA sobre fallos en Windows, + +99 +00:05:23.390 --> 00:05:26.670 +información que pueden usar para +atacar las computadoras de la gente. + +100 +00:05:26.690 --> 00:05:30.750 +Eso es lo que básicamente tienes, +con el software privativo, + +101 +00:05:30.770 --> 00:05:33.790 +el dueño tiene el poder sobre +los usuarios, + +102 +00:05:33.800 --> 00:05:36.340 +y se aprovecha de este poder, + +103 +00:05:36.600 --> 00:05:39.900 +para definir algunas +funcionalidades maliciosas + +104 +00:05:39.910 --> 00:05:41.930 +para dañar al usuario. + +105 +00:05:41.950 --> 00:05:44.910 +Por supuesto que no lo hacen +porque sean sádicos; + +106 +00:05:44.940 --> 00:05:47.710 +lo hacen únicamente por dinero, +por avaricia. + +107 +00:05:47.730 --> 00:05:51.110 +Tienen varias formas para sacar provecho + +108 +00:05:51.130 --> 00:05:53.750 +de este poder sobre los usuarios, + +109 +00:05:53.790 --> 00:05:58.350 +que no hace que incluso que los más +pequeños sean menos malvados. + +110 +00:05:58.370 --> 00:06:00.250 +Ellos no se avergüenzan por esto. + +111 +00:06:00.260 --> 00:06:04.100 +Incluso hacen conferencias donde +hablan sobre las últimas novedades + +112 +00:06:04.310 --> 00:06:08.370 +sobre cómo aprovecharse del usuario +gracias al poder que tienen. + +113 +00:06:08.390 --> 00:06:11.100 +Básicamente, el software privativo, + +114 +00:06:11.100 --> 00:06:15.820 +que es ahora para la mayoría de usuarios +de software privativo, + +115 +00:06:15.840 --> 00:06:18.590 +están usando malware privativo. + +116 +00:06:18.610 --> 00:06:21.200 +Es "software para tontos". + +117 +00:06:21.480 --> 00:06:24.810 +¿Cómo dejar de ser una víctima? + +118 +00:06:24.850 --> 00:06:28.930 +Antiguamente tenías que dejar de usar +computadoras, pero ya no. + +119 +00:06:28.940 --> 00:06:34.260 +Ahora, puedes unirte a nosotros en +el mundo libre que hemos creado. + +120 +00:06:34.290 --> 00:06:38.120 +En 1983, anuncie que desarrollaría + +121 +00:06:38.170 --> 00:06:41.820 +un sistema operativo totalmente libre +llamado GNU. + +122 +00:06:41.830 --> 00:06:45.410 +En 1992, lo teníamos casi terminado, + +123 +00:06:45.430 --> 00:06:48.170 +pero faltaba una pieza, el núcleo [kernel]. + +124 +00:06:48.200 --> 00:06:52.540 +Linus Torvalds, en aquel año, liberó +el núcleo Linux, + +125 +00:06:52.580 --> 00:06:55.180 +con el que llenar el último hueco, +y nos dio + +126 +00:06:55.190 --> 00:07:00.450 +el primer sistema operativo completo +para arrancar en un PC: GNU/Linux. + +127 +00:07:00.790 --> 00:07:07.400 +Desafortunadamente, tener libertad por +un lado no te garantiza mantenerla. + +128 +00:07:07.410 --> 00:07:11.400 +Hay más de un centenar de versiones +diferentes de GNU/Linux. + +129 +00:07:11.430 --> 00:07:13.410 +Conocidas como distribuciones. + +130 +00:07:13.430 --> 00:07:16.270 +Algunas son enteramente software libre; + +131 +00:07:16.270 --> 00:07:18.950 +muchas contienen software privativo, + +132 +00:07:18.950 --> 00:07:22.580 +porque las mantienen personas +no preocupada por la libertad. + +133 +00:07:22.600 --> 00:07:26.860 +Lo añaden a la conciencia +a costa de la libertad. + +134 +00:07:26.870 --> 00:07:30.960 +Por ello tienes que comprobar +que distribución es libre. + +135 +00:07:30.980 --> 00:07:33.750 +Mantener tu libertad requiere +un sacrificio, + +136 +00:07:33.760 --> 00:07:37.720 +a veces un gran sacrificio, como +en Lexington. + +137 +00:07:37.760 --> 00:07:43.950 +En nuestra campaña tienden a ser +pequeños sacrificios. + +138 +00:07:43.970 --> 00:07:48.330 +Cualquier con un poco de madurez +puede hacerlos. + +139 +00:07:48.360 --> 00:07:52.680 +Por ejemplo, quieres aplicaciones pero +algunas no son libres. + +140 +00:07:52.690 --> 00:07:55.390 +Si quieres libertad, tienes +que hacerlo sin ellas. + +141 +00:07:55.410 --> 00:07:58.630 +Puede haber algunos inconvenientes + +142 +00:07:58.790 --> 00:08:01.320 +a sufrir por el bien de su libertad. + +143 +00:08:01.350 --> 00:08:05.850 +Algunas sitios web ejecutan +en el navegador + +144 +00:08:05.860 --> 00:08:09.170 +software privativo +escritos en JavaScript. + +145 +00:08:09.190 --> 00:08:11.420 +Si no quieres ejecutar +software privativo, + +146 +00:08:11.430 --> 00:08:13.870 +deberías instalar LibreJS + +147 +00:08:13.900 --> 00:08:17.570 +que bloquea, y evita +el JavaScript no libre. + +148 +00:08:17.590 --> 00:08:21.900 +A veces, los servidores +te ofrecen realizar tus tareas. + +149 +00:08:21.910 --> 00:08:24.250 +Dicen, "Envíanos toda tu información." + +150 +00:08:24.260 --> 00:08:26.120 +Obviamente, para tontos. + +151 +00:08:26.120 --> 00:08:30.210 +El servidor hace la tarea y te +devuelve los resultados. + +152 +00:08:30.220 --> 00:08:32.860 +Supuestamente no deberías pensar +sobre que lo que pasa, + +153 +00:08:32.890 --> 00:08:37.530 +porque es una "nube", y no puedes +ver lo que ocurre. + +154 +00:08:37.550 --> 00:08:39.180 +Pues deberías mirar. + +155 +00:08:39.190 --> 00:08:42.480 +Se ofrece como un sustituto +del software, + +156 +00:08:42.510 --> 00:08:47.300 +y le quita el control de su computadora. + +157 +00:08:47.330 --> 00:08:50.370 +Una gran parte de los +servidores del mundo + +158 +00:08:50.790 --> 00:08:53.130 +se ejecutan sobre GNU/Linux +y otro software libre. + +159 +00:08:53.140 --> 00:08:56.980 +Sin embargo, creo que las computadoras +mas importantes donde establecer libertad + +160 +00:08:57.120 --> 00:09:00.760 +son las suyas, no las de los servidores. + +161 +00:09:00.790 --> 00:09:02.610 +También merecen ser libres. + +162 +00:09:02.620 --> 00:09:05.940 +Pero por encima de todo es la gente +la que merece libertad. + +163 +00:09:05.950 --> 00:09:08.870 +Necesitamos avanzar, + +164 +00:09:08.870 --> 00:09:12.290 +y para ello, tenemos +que cruzar algunos obstáculos. + +165 +00:09:12.320 --> 00:09:14.540 +Uno de ellos son las grandes compañías + +166 +00:09:14.550 --> 00:09:17.640 +que hacen mucho dinero teniendo +el control sobre los usuarios. + +167 +00:09:17.660 --> 00:09:19.870 +No quieren dejarnos avanzar. + +168 +00:09:19.890 --> 00:09:22.850 +Tenemos que vencer su oposición. + +169 +00:09:22.880 --> 00:09:27.280 +Otra son los medios de comunicación +principales que no hablan del software libre. + +170 +00:09:27.290 --> 00:09:32.350 +Tienen un término que usan para +evitar hablar de cuestiones éticas. + +171 +00:09:32.380 --> 00:09:35.230 +Lo llaman "código abierto". + +172 +00:09:35.260 --> 00:09:39.450 +Ahora, se habla más o menos de +los mismos programas, + +173 +00:09:39.470 --> 00:09:41.390 +pero con diferentes ideas. + +174 +00:09:41.410 --> 00:09:43.650 +Donde los activistas del +software libre dicen, + +175 +00:09:43.660 --> 00:09:45.580 +"Es una cuestión de lo correcto y +lo incorrecto. + +176 +00:09:45.600 --> 00:09:47.850 +Los usuarios precisan libertad, +queremos libertad." + +177 +00:09:47.870 --> 00:09:50.750 +La gente que dice código abierto, +no quieren decir eso. + +178 +00:09:50.770 --> 00:09:52.170 +En cambio, dicen, + +179 +00:09:52.190 --> 00:09:55.770 +"Dejen a los usuarios cambiar +el software y redistribuirlo, + +180 +00:09:55.840 --> 00:09:57.620 +y mejorarán el código. + +181 +00:09:57.650 --> 00:09:58.900 +Corregirán muchos fallos." + +182 +00:10:00.160 --> 00:10:01.430 +Quizás sea sea verdad, pero + +183 +00:10:01.430 --> 00:10:04.700 +Si queremos mantener nuestra libertad, +tenemos que hablar de la libertad. + +184 +00:10:04.720 --> 00:10:08.320 +Digan "software libre", y así +nos ayudarán todo el tiempo. + +185 +00:10:08.360 --> 00:10:12.680 +Otro obstáculo es que muchas escuelas +enseñan software no libre, + +186 +00:10:12.700 --> 00:10:16.240 +que básicamente es como enseñar +a los niños a fumar tabaco. + +187 +00:10:16.250 --> 00:10:18.220 +Es implantar la dependencia, + +188 +00:10:18.240 --> 00:10:20.560 +lo opuesto a lo que las escuelas +deberían hacer. + +189 +00:10:20.560 --> 00:10:24.570 +La escuela debería preparar a +los ciudadanos para vivir + +190 +00:10:24.580 --> 00:10:30.900 +en una sociedad fuerte, capaz, +independiente y cooperativa, + +191 +00:10:30.910 --> 00:10:34.550 +lo cual significa, enseñar software libre +en las escuelas. + +192 +00:10:34.570 --> 00:10:37.460 +Pero hay otra razón para hacer esto +por la educación. + +193 +00:10:37.480 --> 00:10:40.770 +Algunos niños quieren convertirse +en programadores, son curiosos. + +194 +00:10:40.770 --> 00:10:42.660 +Quieren saber cómo funciona +el programa. + +195 +00:10:42.670 --> 00:10:45.670 +Cuando alguien que estudia software libre +puede comprenderlo, + +196 +00:10:45.690 --> 00:10:49.430 +el que estudia software no libre +no puede aprender nada, + +197 +00:10:49.440 --> 00:10:53.190 +porque el conocimiento en +el programa no libre + +198 +00:10:53.220 --> 00:10:56.490 +es retenido y negado a los estudiantes. + +199 +00:10:56.510 --> 00:10:58.820 +Para defender el espíritu de la educación, + +200 +00:10:58.840 --> 00:11:01.380 +la escuela debería asegurarse de +que sus programas son libres. + +201 +00:11:01.390 --> 00:11:04.280 +Pero aún hay una razón más importante: + +202 +00:11:04.300 --> 00:11:07.170 +Las escuelas deberían enseñar el espíritu +de la buena voluntad, + +203 +00:11:07.180 --> 00:11:09.320 +el hábito de ayudar a otros. + +204 +00:11:09.330 --> 00:11:11.120 +La clase debería decir, + +205 +00:11:11.130 --> 00:11:13.440 +"Si traes un programa a clase, + +206 +00:11:13.450 --> 00:11:15.830 +es como si llevaras galletas a clase, + +207 +00:11:15.850 --> 00:11:17.870 +tienes que compartirlas con todos. + +208 +00:11:17.880 --> 00:11:19.560 +No puedes guardártelas para ti solo. + +209 +00:11:19.570 --> 00:11:23.680 +Tienes que compartir el código fuente, +para que otros puedan aprender. + +210 +00:11:23.710 --> 00:11:27.100 +Así que no traigas ningún +código privativo a esta clase." + +211 +00:11:27.100 --> 00:11:31.890 +La escuela tiene que dar un buen ejemplo +siguiendo sus propias normas: + +212 +00:11:31.900 --> 00:11:34.560 +Deberías traer únicamente +software libre a esta clase, + +213 +00:11:34.600 --> 00:11:39.290 +excepto si es un ejercicio +de ingeniería inversa. + +214 +00:11:39.310 --> 00:11:41.920 +Otro obstáculo es que hay hardware + +215 +00:11:41.940 --> 00:11:44.680 +para el cual no sabemos cómo +escribir el código, + +216 +00:11:44.700 --> 00:11:47.460 +porque tampoco nos cuentan cómo +usar dicho hardware. + +217 +00:11:47.480 --> 00:11:50.200 +Es sorprendente que quieran +venderte el producto + +218 +00:11:50.210 --> 00:11:52.290 +y no te digan cómo usarlo. + +219 +00:11:52.300 --> 00:11:55.780 +Dicen, "Aquí tienes un programa +no libre para utilizarlo. + +220 +00:11:55.790 --> 00:11:59.240 +Ejecútalo y calla. +No nos molestes." + +221 +00:11:59.300 --> 00:12:03.900 +¿Cómo se puede averiguar cómo funciona +ese hardware con ingeniería inversa? + +222 +00:12:03.910 --> 00:12:08.550 +Tienes que estudiar todos esos ceros +y uno para imaginarte qué hacen, + +223 +00:12:08.580 --> 00:12:11.390 +y anotar cómo utilizar el hardware, + +224 +00:12:11.410 --> 00:12:14.370 +para que alguien pueda escribir +el programa libre que lo haga. + +225 +00:12:14.390 --> 00:12:16.690 +Es un trabajo duro pero puede hacerse. + +226 +00:12:16.700 --> 00:12:19.280 +Si quieres hacer una +gran contribución técnica, + +227 +00:12:19.300 --> 00:12:21.240 +eso es lo que deberías hacer. + +228 +00:12:21.270 --> 00:12:24.650 +Cada nueva área, actividad de la vida, + +229 +00:12:24.690 --> 00:12:28.860 +puede traer consigo nuevos derechos +humanos que son necesarios. + +230 +00:12:28.880 --> 00:12:31.300 +Los derechos humanos dependen +unos de los otros. + +231 +00:12:31.310 --> 00:12:32.760 +Si pierdes uno, + +232 +00:12:32.780 --> 00:12:35.550 +resulta difícil mantener los otros. + +233 +00:12:35.570 --> 00:12:39.770 +Por eso, hoy día la programación +es tan importante para la sociedad + +234 +00:12:39.790 --> 00:12:44.590 +que las libertades del software libre +se encuentran entre los derechos humanos + +235 +00:12:44.750 --> 00:12:47.170 +que la sociedad debe establecer y proteger. + +236 +00:12:47.170 --> 00:12:49.630 +¿Cómo ayudar? + +237 +00:12:49.650 --> 00:12:51.670 +Puedes escribir software libre, + +238 +00:12:51.690 --> 00:12:54.460 +organizar grupos en una campaña + +239 +00:12:54.470 --> 00:12:58.150 +y persuadir a las escuelas y gobiernos +para promover el software libre. + +240 +00:12:58.170 --> 00:13:01.790 +Puedes ayudar a otra gente cuando +tienen problemas usando software libre, + +241 +00:13:01.810 --> 00:13:03.680 +o incluso con la instalación. + +242 +00:13:03.690 --> 00:13:08.370 +Puedes decir, "software libre," +y esparcir la idea filosófica. + +243 +00:13:08.390 --> 00:13:13.270 +Cambiarse al software libre es el primer +paso de la liberación del ciberespacio, + +244 +00:13:13.290 --> 00:13:15.400 +pero por supuesto, necesitamos Internet. + +245 +00:13:15.420 --> 00:13:17.310 +Necesitamos otras libertades allí, + +246 +00:13:17.600 --> 00:13:20.720 +como la neutralidad de la red, y poner fin a + +247 +00:13:20.750 --> 00:13:24.470 +la vigilancia de las personas. + +248 +00:13:24.830 --> 00:13:27.290 +(Aplausos) diff --git a/emacsen-001-reporte-y-como-empece.md b/emacsen-001-reporte-y-como-empece.md new file mode 100644 index 0000000..e69de29 diff --git a/emacsen-001-reporte.md b/emacsen-001-reporte.md new file mode 100644 index 0000000..e69de29 diff --git a/emacsen-002-como-empece-detalles.md b/emacsen-002-como-empece-detalles.md new file mode 100644 index 0000000..e69de29 diff --git a/emacsen-002-eLisp-tipo-bash.md b/emacsen-002-eLisp-tipo-bash.md new file mode 100644 index 0000000..e69de29 diff --git a/emacsen-003-touchpad.md b/emacsen-003-touchpad.md new file mode 100644 index 0000000..e69de29 diff --git a/emacsen-006-bloques-de-tiempo.md b/emacsen-006-bloques-de-tiempo.md new file mode 100644 index 0000000..e69de29 diff --git a/libretube-theme/babel.cfg b/libretube-theme/babel.cfg new file mode 100644 index 0000000..2274808 --- /dev/null +++ b/libretube-theme/babel.cfg @@ -0,0 +1 @@ +[jinja2: templates/**.html] diff --git a/libretube-theme/messages.pot b/libretube-theme/messages.pot new file mode 100644 index 0000000..83bce6d --- /dev/null +++ b/libretube-theme/messages.pot @@ -0,0 +1,254 @@ +# Translations template for PROJECT. +# Copyright (C) 2020 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2020. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2020-06-17 20:01-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.7.0\n" + +#: templates/archives.html:5 +#, python-format +msgid "Archivos de %(sitename)s" +msgstr "" + +#: templates/archives.html:9 +#, python-format +msgid "Lista de artículos publicados en %(sitename)s" +msgstr "" + +#: templates/archives.html:10 +msgid "archivos,artículos,historia,lista de artículos" +msgstr "" + +#: templates/archives.html:57 +#, python-format +msgid "%(num)d artículo" +msgid_plural "%(num)d artículos" +msgstr[0] "" +msgstr[1] "" + +#: templates/article.html:92 +msgid "Licencia" +msgstr "" + +#: templates/article.html:177 +msgid "Publicado el" +msgstr "" + +#: templates/article.html:180 +#, python-format +msgid "Vídeos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article.html:183 +msgid "de" +msgstr "" + +#: templates/article.html:185 +#, python-format +msgid "Vídeos de %(año)s" +msgstr "" + +#: templates/article.html:199 +#, python-format +msgid "" +"Lo siento, el sistema de comentarios no funciona sin JavaScript. Si " +"deseas, puedes %(abre_enlace)s enviar tu comentario por correo " +"electrónico %(cierra_enlace)s. El comentario será publicado en el espacio" +" reservado a comentarios de esta página." +msgstr "" + +#: templates/article.html:248 templates/base.html:113 +#, python-format +msgid "Ver %(articulo)s" +msgstr "" + +#: templates/article_info.html:16 templates/article_info_aside.html:16 +#, python-format +msgid "Artículos de %(nombre_mes)s de %(año)s" +msgstr "" + +#: templates/article_info.html:20 templates/article_info_aside.html:20 +#, python-format +msgid "Artículos de %(año)s" +msgstr "" + +#: templates/article_info.html:32 +msgid "Fecha de modificación" +msgstr "" + +#: templates/article_info.html:47 templates/article_info_aside.html:34 +msgid "Autor del artículo" +msgstr "" + +#: templates/author.html:5 templates/author.html:11 +#, python-format +msgid "Artículos escritos por %(author)s en %(sitename)s" +msgstr "" + +#: templates/author.html:12 +#, python-format +msgid "articulista,artículos,author,autor %(author)s,escritor,%(author)s" +msgstr "" + +#: templates/author.html:28 +#, python-format +msgid "Autor: %(author)s" +msgstr "" + +#: templates/authors.html:5 +#, python-format +msgid "Créditos de %(sitename)s" +msgstr "" + +#: templates/authors.html:9 templates/authors.html:14 templates/authors.html:20 +#, python-format +msgid "Lista de autores de %(sitename)s" +msgstr "" + +#: templates/authors.html:10 +msgid "articulistas, autores, colaboradores, escritores, lista de autores" +msgstr "" + +#: templates/authors.html:31 +msgid "Artículos de vídeo" +msgstr "" + +#: templates/authors.html:36 +#, python-format +msgid "Artículos escritos por %(author)s" +msgstr "" + +#: templates/authors.html:42 +msgid "Programación" +msgstr "" + +#: templates/authors.html:44 +msgid "Sitio para gente Libre" +msgstr "" + +#: templates/authors.html:45 +msgid "Sitio web de Jesús E." +msgstr "" + +#: templates/authors.html:48 +msgid "Traducción" +msgstr "" + +#: templates/authors.html:50 +msgid "Sitio web de Alyssa Rosenzweig" +msgstr "" + +#: templates/authors.html:54 +msgid "Software que usa la página" +msgstr "" + +#: templates/authors.html:61 +msgid "Algunos programas de JavaScript" +msgstr "" + +#: templates/authors.html:64 +#, python-format +msgid "Sitio web de %(programa)s" +msgstr "" + +#: templates/base.html:38 +msgid "Escribe para buscar..." +msgstr "" + +#: templates/base.html:48 +msgid "VideoTeca" +msgstr "" + +#: templates/base.html:66 +msgid "Inicio" +msgstr "" + +#: templates/base.html:70 +msgid "Archivos" +msgstr "" + +#: templates/base.html:93 +msgid "Ver ahora" +msgstr "" + +#: templates/base.html:161 templates/base.html:163 +msgid "Política de uso" +msgstr "" + +#: templates/base.html:168 +msgid "Licencias de JavaScript" +msgstr "" + +#: templates/base.html:172 +msgid "Código fuente" +msgstr "" + +#: templates/base.html:179 +msgid "Versión Actual:" +msgstr "" + +#: templates/categories.html:5 templates/categories.html:8 +#, python-format +msgid "Lista de categorías de %(sitename)s" +msgstr "" + +#: templates/categories.html:9 +msgid "categorías" +msgstr "" + +#: templates/categories.html:21 +msgid "Lista de categorías" +msgstr "" + +#: templates/index.html:5 +msgid "Página" +msgstr "" + +#: templates/index.html:15 +msgid "Videoteca de software libre brindando avance tecnológico" +msgstr "" + +#: templates/period_archives.html:7 templates/period_archives.html:27 +#, python-format +msgid "Archivos de %(año)d" +msgstr "" + +#: templates/period_archives.html:9 templates/period_archives.html:29 +#, python-format +msgid "Archivos de %(mes)s de %(año)d" +msgstr "" + +#: templates/period_archives.html:11 templates/period_archives.html:31 +#, python-format +msgid "Archivos del %(dia)d de %(mes)s de %(año)d" +msgstr "" + +#: templates/tags.html:5 templates/tags.html:8 +#, python-format +msgid "Lista de etiquetas de %(sitename)s" +msgstr "" + +#: templates/tags.html:9 +msgid "etiquetas,palabras clave" +msgstr "" + +#: templates/tags.html:16 +msgid "Lista de etiquetas" +msgstr "" + +#: templates/translations.html:3 +msgid "Traducciones:" +msgstr "" + diff --git a/libretube-theme/static/css/bootstrap/bootstrap.css b/libretube-theme/static/css/bootstrap/bootstrap.css new file mode 100644 index 0000000..056e718 --- /dev/null +++ b/libretube-theme/static/css/bootstrap/bootstrap.css @@ -0,0 +1,6000 @@ +/*! + * Bootstrap v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +:root { + --blue: #007bff; + --indigo: #6610f2; + --purple: #6f42c1; + --pink: #e83e8c; + --red: #dc3545; + --orange: #fd7e14; + --yellow: #ffc107; + --green: #28a745; + --teal: #20c997; + --cyan: #17a2b8; + --white: #fff; + --gray: #6c757d; + --gray-dark: #343a40; + --primary: #007bff; + --secondary: #6c757d; + --success: #28a745; + --info: #17a2b8; + --warning: #ffc107; + --danger: #dc3545; + --light: #f8f9fa; + --dark: #343a40; + --breakpoint-xs: 0; + --breakpoint-sm: 576px; + --breakpoint-md: 768px; + --breakpoint-lg: 992px; + --breakpoint-xl: 1200px; + --font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html { + font-family: sans-serif; + line-height: 1.15; + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +article, aside, figcaption, figure, footer, header, hgroup, main, nav, section { + display: block; +} + +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #212529; + text-align: left; + background-color: #fff; +} + +[tabindex="-1"]:focus:not(:focus-visible) { + outline: 0 !important; +} + +hr { + box-sizing: content-box; + height: 0; + overflow: visible; +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title], +abbr[data-original-title] { + text-decoration: underline; + text-decoration: underline dotted; + cursor: help; + border-bottom: 0; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: .5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small { + font-size: 80%; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -.25em; +} + +sup { + top: -.5em; +} + +a { + color: #007bff; + text-decoration: none; + background-color: transparent; +} +a:hover { + color: #0056b3; + text-decoration: underline; +} + +a:not([href]):not([tabindex]) { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus { + color: inherit; + text-decoration: none; +} +a:not([href]):not([tabindex]):focus { + outline: 0; +} + +pre, +code, +kbd, +samp { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + font-size: 1em; +} + +pre { + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; +} + +figure { + margin: 0 0 1rem; +} + +img { + vertical-align: middle; + border-style: none; +} + +svg { + overflow: hidden; + vertical-align: middle; +} + +table { + border-collapse: collapse; +} + +caption { + padding-top: 0.75rem; + padding-bottom: 0.75rem; + color: #6c757d; + text-align: left; + caption-side: bottom; +} + +th { + text-align: inherit; +} + +label { + display: inline-block; + margin-bottom: 0.5rem; +} + +button { + border-radius: 0; +} + +button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +input { + overflow: visible; +} + +button, +select { + text-transform: none; +} + +select { + word-wrap: normal; +} + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +button:not(:disabled), +[type="button"]:not(:disabled), +[type="reset"]:not(:disabled), +[type="submit"]:not(:disabled) { + cursor: pointer; +} + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + padding: 0; + border-style: none; +} + +input[type="radio"], +input[type="checkbox"] { + box-sizing: border-box; + padding: 0; +} + +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input[type="month"] { + -webkit-appearance: listbox; +} + +textarea { + overflow: auto; + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + max-width: 100%; + padding: 0; + margin-bottom: .5rem; + font-size: 1.5rem; + line-height: inherit; + color: inherit; + white-space: normal; +} + +progress { + vertical-align: baseline; +} + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +[type="search"] { + outline-offset: -2px; + -webkit-appearance: none; +} + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +summary { + display: list-item; + cursor: pointer; +} + +template { + display: none; +} + +[hidden] { + display: none !important; +} + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} + +h1, .h1 { + font-size: 2.5rem; +} + +h2, .h2 { + font-size: 2rem; +} + +h3, .h3 { + font-size: 1.75rem; +} + +h4, .h4 { + font-size: 1.5rem; +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-size: 6rem; + font-weight: 300; + line-height: 1.2; +} + +.display-2 { + font-size: 5.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-3 { + font-size: 4.5rem; + font-weight: 300; + line-height: 1.2; +} + +.display-4 { + font-size: 3.5rem; + font-weight: 300; + line-height: 1.2; +} + +hr { + margin-top: 1rem; + margin-bottom: 1rem; + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.1); +} + +small, +.small { + font-size: 80%; + font-weight: 400; +} + +mark, +.mark { + padding: 0.2em; + background-color: #fcf8e3; +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} + +.blockquote-footer { + display: block; + font-size: 80%; + color: #6c757d; +} +.blockquote-footer::before { + content: "\2014\00A0"; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: #fff; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 90%; + color: #6c757d; +} + +code { + font-size: 87.5%; + color: #e83e8c; + word-break: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.2rem 0.4rem; + font-size: 87.5%; + color: #fff; + background-color: #212529; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; +} + +pre { + display: block; + font-size: 87.5%; + color: #212529; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.col-2 { + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.col-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.col-5 { + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.col-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.col-8 { + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.col-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.col-11 { + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.col-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.3333333333%; +} + +.offset-2 { + margin-left: 16.6666666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.3333333333%; +} + +.offset-5 { + margin-left: 41.6666666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.3333333333%; +} + +.offset-8 { + margin-left: 66.6666666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.3333333333%; +} + +.offset-11 { + margin-left: 91.6666666667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-sm-1 { + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-sm-2 { + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-sm-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-sm-4 { + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-sm-5 { + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-sm-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-sm-7 { + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-sm-8 { + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-sm-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-sm-10 { + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-sm-11 { + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-sm-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-sm-first { + -ms-flex-order: -1; + order: -1; + } + + .order-sm-last { + -ms-flex-order: 13; + order: 13; + } + + .order-sm-0 { + -ms-flex-order: 0; + order: 0; + } + + .order-sm-1 { + -ms-flex-order: 1; + order: 1; + } + + .order-sm-2 { + -ms-flex-order: 2; + order: 2; + } + + .order-sm-3 { + -ms-flex-order: 3; + order: 3; + } + + .order-sm-4 { + -ms-flex-order: 4; + order: 4; + } + + .order-sm-5 { + -ms-flex-order: 5; + order: 5; + } + + .order-sm-6 { + -ms-flex-order: 6; + order: 6; + } + + .order-sm-7 { + -ms-flex-order: 7; + order: 7; + } + + .order-sm-8 { + -ms-flex-order: 8; + order: 8; + } + + .order-sm-9 { + -ms-flex-order: 9; + order: 9; + } + + .order-sm-10 { + -ms-flex-order: 10; + order: 10; + } + + .order-sm-11 { + -ms-flex-order: 11; + order: 11; + } + + .order-sm-12 { + -ms-flex-order: 12; + order: 12; + } + + .offset-sm-0 { + margin-left: 0; + } + + .offset-sm-1 { + margin-left: 8.3333333333%; + } + + .offset-sm-2 { + margin-left: 16.6666666667%; + } + + .offset-sm-3 { + margin-left: 25%; + } + + .offset-sm-4 { + margin-left: 33.3333333333%; + } + + .offset-sm-5 { + margin-left: 41.6666666667%; + } + + .offset-sm-6 { + margin-left: 50%; + } + + .offset-sm-7 { + margin-left: 58.3333333333%; + } + + .offset-sm-8 { + margin-left: 66.6666666667%; + } + + .offset-sm-9 { + margin-left: 75%; + } + + .offset-sm-10 { + margin-left: 83.3333333333%; + } + + .offset-sm-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-md-1 { + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-md-2 { + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-md-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-md-4 { + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-md-5 { + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-md-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-md-7 { + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-md-8 { + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-md-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-md-10 { + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-md-11 { + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-md-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-md-first { + -ms-flex-order: -1; + order: -1; + } + + .order-md-last { + -ms-flex-order: 13; + order: 13; + } + + .order-md-0 { + -ms-flex-order: 0; + order: 0; + } + + .order-md-1 { + -ms-flex-order: 1; + order: 1; + } + + .order-md-2 { + -ms-flex-order: 2; + order: 2; + } + + .order-md-3 { + -ms-flex-order: 3; + order: 3; + } + + .order-md-4 { + -ms-flex-order: 4; + order: 4; + } + + .order-md-5 { + -ms-flex-order: 5; + order: 5; + } + + .order-md-6 { + -ms-flex-order: 6; + order: 6; + } + + .order-md-7 { + -ms-flex-order: 7; + order: 7; + } + + .order-md-8 { + -ms-flex-order: 8; + order: 8; + } + + .order-md-9 { + -ms-flex-order: 9; + order: 9; + } + + .order-md-10 { + -ms-flex-order: 10; + order: 10; + } + + .order-md-11 { + -ms-flex-order: 11; + order: 11; + } + + .order-md-12 { + -ms-flex-order: 12; + order: 12; + } + + .offset-md-0 { + margin-left: 0; + } + + .offset-md-1 { + margin-left: 8.3333333333%; + } + + .offset-md-2 { + margin-left: 16.6666666667%; + } + + .offset-md-3 { + margin-left: 25%; + } + + .offset-md-4 { + margin-left: 33.3333333333%; + } + + .offset-md-5 { + margin-left: 41.6666666667%; + } + + .offset-md-6 { + margin-left: 50%; + } + + .offset-md-7 { + margin-left: 58.3333333333%; + } + + .offset-md-8 { + margin-left: 66.6666666667%; + } + + .offset-md-9 { + margin-left: 75%; + } + + .offset-md-10 { + margin-left: 83.3333333333%; + } + + .offset-md-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-lg-1 { + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-lg-2 { + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-lg-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-lg-4 { + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-lg-5 { + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-lg-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-lg-7 { + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-lg-8 { + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-lg-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-lg-10 { + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-lg-11 { + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-lg-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-lg-first { + -ms-flex-order: -1; + order: -1; + } + + .order-lg-last { + -ms-flex-order: 13; + order: 13; + } + + .order-lg-0 { + -ms-flex-order: 0; + order: 0; + } + + .order-lg-1 { + -ms-flex-order: 1; + order: 1; + } + + .order-lg-2 { + -ms-flex-order: 2; + order: 2; + } + + .order-lg-3 { + -ms-flex-order: 3; + order: 3; + } + + .order-lg-4 { + -ms-flex-order: 4; + order: 4; + } + + .order-lg-5 { + -ms-flex-order: 5; + order: 5; + } + + .order-lg-6 { + -ms-flex-order: 6; + order: 6; + } + + .order-lg-7 { + -ms-flex-order: 7; + order: 7; + } + + .order-lg-8 { + -ms-flex-order: 8; + order: 8; + } + + .order-lg-9 { + -ms-flex-order: 9; + order: 9; + } + + .order-lg-10 { + -ms-flex-order: 10; + order: 10; + } + + .order-lg-11 { + -ms-flex-order: 11; + order: 11; + } + + .order-lg-12 { + -ms-flex-order: 12; + order: 12; + } + + .offset-lg-0 { + margin-left: 0; + } + + .offset-lg-1 { + margin-left: 8.3333333333%; + } + + .offset-lg-2 { + margin-left: 16.6666666667%; + } + + .offset-lg-3 { + margin-left: 25%; + } + + .offset-lg-4 { + margin-left: 33.3333333333%; + } + + .offset-lg-5 { + margin-left: 41.6666666667%; + } + + .offset-lg-6 { + margin-left: 50%; + } + + .offset-lg-7 { + margin-left: 58.3333333333%; + } + + .offset-lg-8 { + margin-left: 66.6666666667%; + } + + .offset-lg-9 { + margin-left: 75%; + } + + .offset-lg-10 { + margin-left: 83.3333333333%; + } + + .offset-lg-11 { + margin-left: 91.6666666667%; + } +} +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + + .col-xl-1 { + -ms-flex: 0 0 8.3333333333%; + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + + .col-xl-2 { + -ms-flex: 0 0 16.6666666667%; + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + + .col-xl-3 { + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + + .col-xl-4 { + -ms-flex: 0 0 33.3333333333%; + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + + .col-xl-5 { + -ms-flex: 0 0 41.6666666667%; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + + .col-xl-6 { + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + + .col-xl-7 { + -ms-flex: 0 0 58.3333333333%; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + + .col-xl-8 { + -ms-flex: 0 0 66.6666666667%; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + + .col-xl-9 { + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + + .col-xl-10 { + -ms-flex: 0 0 83.3333333333%; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + + .col-xl-11 { + -ms-flex: 0 0 91.6666666667%; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + + .col-xl-12 { + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + + .order-xl-first { + -ms-flex-order: -1; + order: -1; + } + + .order-xl-last { + -ms-flex-order: 13; + order: 13; + } + + .order-xl-0 { + -ms-flex-order: 0; + order: 0; + } + + .order-xl-1 { + -ms-flex-order: 1; + order: 1; + } + + .order-xl-2 { + -ms-flex-order: 2; + order: 2; + } + + .order-xl-3 { + -ms-flex-order: 3; + order: 3; + } + + .order-xl-4 { + -ms-flex-order: 4; + order: 4; + } + + .order-xl-5 { + -ms-flex-order: 5; + order: 5; + } + + .order-xl-6 { + -ms-flex-order: 6; + order: 6; + } + + .order-xl-7 { + -ms-flex-order: 7; + order: 7; + } + + .order-xl-8 { + -ms-flex-order: 8; + order: 8; + } + + .order-xl-9 { + -ms-flex-order: 9; + order: 9; + } + + .order-xl-10 { + -ms-flex-order: 10; + order: 10; + } + + .order-xl-11 { + -ms-flex-order: 11; + order: 11; + } + + .order-xl-12 { + -ms-flex-order: 12; + order: 12; + } + + .offset-xl-0 { + margin-left: 0; + } + + .offset-xl-1 { + margin-left: 8.3333333333%; + } + + .offset-xl-2 { + margin-left: 16.6666666667%; + } + + .offset-xl-3 { + margin-left: 25%; + } + + .offset-xl-4 { + margin-left: 33.3333333333%; + } + + .offset-xl-5 { + margin-left: 41.6666666667%; + } + + .offset-xl-6 { + margin-left: 50%; + } + + .offset-xl-7 { + margin-left: 58.3333333333%; + } + + .offset-xl-8 { + margin-left: 66.6666666667%; + } + + .offset-xl-9 { + margin-left: 75%; + } + + .offset-xl-10 { + margin-left: 83.3333333333%; + } + + .offset-xl-11 { + margin-left: 91.6666666667%; + } +} +.table { + width: 100%; + margin-bottom: 1rem; + color: #212529; +} +.table th, +.table td { + padding: 0.75rem; + vertical-align: top; + border-top: 1px solid #dee2e6; +} +.table thead th { + vertical-align: bottom; + border-bottom: 2px solid #dee2e6; +} +.table tbody + tbody { + border-top: 2px solid #dee2e6; +} + +.table-sm th, +.table-sm td { + padding: 0.3rem; +} + +.table-bordered { + border: 1px solid #dee2e6; +} +.table-bordered th, +.table-bordered td { + border: 1px solid #dee2e6; +} +.table-bordered thead th, +.table-bordered thead td { + border-bottom-width: 2px; +} + +.table-borderless th, +.table-borderless td, +.table-borderless thead th, +.table-borderless tbody + tbody { + border: 0; +} + +.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(0, 0, 0, 0.05); +} + +.table-hover tbody tr:hover { + color: #212529; + background-color: rgba(0, 0, 0, 0.075); +} + +.table-primary, +.table-primary > th, +.table-primary > td { + background-color: #b8daff; +} +.table-primary th, +.table-primary td, +.table-primary thead th, +.table-primary tbody + tbody { + border-color: #7abaff; +} + +.table-hover .table-primary:hover { + background-color: #9fcdff; +} +.table-hover .table-primary:hover > td, +.table-hover .table-primary:hover > th { + background-color: #9fcdff; +} + +.table-secondary, +.table-secondary > th, +.table-secondary > td { + background-color: #d6d8db; +} +.table-secondary th, +.table-secondary td, +.table-secondary thead th, +.table-secondary tbody + tbody { + border-color: #b3b7bb; +} + +.table-hover .table-secondary:hover { + background-color: #c8cbcf; +} +.table-hover .table-secondary:hover > td, +.table-hover .table-secondary:hover > th { + background-color: #c8cbcf; +} + +.table-success, +.table-success > th, +.table-success > td { + background-color: #c3e6cb; +} +.table-success th, +.table-success td, +.table-success thead th, +.table-success tbody + tbody { + border-color: #8fd19e; +} + +.table-hover .table-success:hover { + background-color: #b1dfbb; +} +.table-hover .table-success:hover > td, +.table-hover .table-success:hover > th { + background-color: #b1dfbb; +} + +.table-info, +.table-info > th, +.table-info > td { + background-color: #bee5eb; +} +.table-info th, +.table-info td, +.table-info thead th, +.table-info tbody + tbody { + border-color: #86cfda; +} + +.table-hover .table-info:hover { + background-color: #abdde5; +} +.table-hover .table-info:hover > td, +.table-hover .table-info:hover > th { + background-color: #abdde5; +} + +.table-warning, +.table-warning > th, +.table-warning > td { + background-color: #ffeeba; +} +.table-warning th, +.table-warning td, +.table-warning thead th, +.table-warning tbody + tbody { + border-color: #ffdf7e; +} + +.table-hover .table-warning:hover { + background-color: #ffe8a1; +} +.table-hover .table-warning:hover > td, +.table-hover .table-warning:hover > th { + background-color: #ffe8a1; +} + +.table-danger, +.table-danger > th, +.table-danger > td { + background-color: #f5c6cb; +} +.table-danger th, +.table-danger td, +.table-danger thead th, +.table-danger tbody + tbody { + border-color: #ed969e; +} + +.table-hover .table-danger:hover { + background-color: #f1b0b7; +} +.table-hover .table-danger:hover > td, +.table-hover .table-danger:hover > th { + background-color: #f1b0b7; +} + +.table-light, +.table-light > th, +.table-light > td { + background-color: #fdfdfe; +} +.table-light th, +.table-light td, +.table-light thead th, +.table-light tbody + tbody { + border-color: #fbfcfc; +} + +.table-hover .table-light:hover { + background-color: #ececf6; +} +.table-hover .table-light:hover > td, +.table-hover .table-light:hover > th { + background-color: #ececf6; +} + +.table-dark, +.table-dark > th, +.table-dark > td { + background-color: #c6c8ca; +} +.table-dark th, +.table-dark td, +.table-dark thead th, +.table-dark tbody + tbody { + border-color: #95999c; +} + +.table-hover .table-dark:hover { + background-color: #b9bbbe; +} +.table-hover .table-dark:hover > td, +.table-hover .table-dark:hover > th { + background-color: #b9bbbe; +} + +.table-active, +.table-active > th, +.table-active > td { + background-color: rgba(0, 0, 0, 0.075); +} + +.table-hover .table-active:hover { + background-color: rgba(0, 0, 0, 0.075); +} +.table-hover .table-active:hover > td, +.table-hover .table-active:hover > th { + background-color: rgba(0, 0, 0, 0.075); +} + +.table .thead-dark th { + color: #fff; + background-color: #343a40; + border-color: #454d55; +} +.table .thead-light th { + color: #495057; + background-color: #e9ecef; + border-color: #dee2e6; +} + +.table-dark { + color: #fff; + background-color: #343a40; +} +.table-dark th, +.table-dark td, +.table-dark thead th { + border-color: #454d55; +} +.table-dark.table-bordered { + border: 0; +} +.table-dark.table-striped tbody tr:nth-of-type(odd) { + background-color: rgba(255, 255, 255, 0.05); +} +.table-dark.table-hover tbody tr:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.075); +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-sm > .table-bordered { + border: 0; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-md > .table-bordered { + border: 0; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-lg > .table-bordered { + border: 0; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } + .table-responsive-xl > .table-bordered { + border: 0; + } +} +.table-responsive { + display: block; + width: 100%; + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +.table-responsive > .table-bordered { + border: 0; +} + +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; + border-radius: 0.25rem; +} + +.page-link { + position: relative; + display: block; + padding: 0.5rem 0.75rem; + margin-left: -1px; + line-height: 1.25; + color: #007bff; + background-color: #fff; + border: 1px solid #dee2e6; +} +.page-link:hover { + z-index: 2; + color: #0056b3; + text-decoration: none; + background-color: #e9ecef; + border-color: #dee2e6; +} +.page-link:focus { + z-index: 2; + outline: 0; + box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); +} + +.page-item:first-child .page-link { + margin-left: 0; + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.page-item.active .page-link { + z-index: 1; + color: #fff; + background-color: #007bff; + border-color: #007bff; +} +.page-item.disabled .page-link { + color: #6c757d; + pointer-events: none; + cursor: auto; + background-color: #fff; + border-color: #dee2e6; +} + +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; + line-height: 1.5; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} + +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + line-height: 1.5; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.bg-primary { + background-color: #007bff !important; +} + +.bg-secondary { + background-color: #6c757d !important; +} + +.bg-success { + background-color: #28a745 !important; +} + +.bg-info { + background-color: #17a2b8 !important; +} + +.bg-warning { + background-color: #ffc107 !important; +} + +.bg-danger { + background-color: #dc3545 !important; +} + +.bg-light { + background-color: #f8f9fa !important; +} + +.bg-dark { + background-color: #343a40 !important; +} + +.bg-white { + background-color: #fff !important; +} + +.bg-transparent { + background-color: transparent !important; +} + +.border { + border: 1px solid #dee2e6 !important; +} + +.border-top { + border-top: 1px solid #dee2e6 !important; +} + +.border-right { + border-right: 1px solid #dee2e6 !important; +} + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} + +.border-left { + border-left: 1px solid #dee2e6 !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-right-0 { + border-right: 0 !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-left-0 { + border-left: 0 !important; +} + +.border-primary { + border-color: #007bff !important; +} + +.border-secondary { + border-color: #6c757d !important; +} + +.border-success { + border-color: #28a745 !important; +} + +.border-info { + border-color: #17a2b8 !important; +} + +.border-warning { + border-color: #ffc107 !important; +} + +.border-danger { + border-color: #dc3545 !important; +} + +.border-light { + border-color: #f8f9fa !important; +} + +.border-dark { + border-color: #343a40 !important; +} + +.border-white { + border-color: #fff !important; +} + +.rounded-sm { + border-radius: 0.2rem !important; +} + +.rounded { + border-radius: 0.25rem !important; +} + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} + +.rounded-lg { + border-radius: 0.3rem !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: 50rem !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} + +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; + } + + .d-sm-inline { + display: inline !important; + } + + .d-sm-inline-block { + display: inline-block !important; + } + + .d-sm-block { + display: block !important; + } + + .d-sm-table { + display: table !important; + } + + .d-sm-table-row { + display: table-row !important; + } + + .d-sm-table-cell { + display: table-cell !important; + } + + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 768px) { + .d-md-none { + display: none !important; + } + + .d-md-inline { + display: inline !important; + } + + .d-md-inline-block { + display: inline-block !important; + } + + .d-md-block { + display: block !important; + } + + .d-md-table { + display: table !important; + } + + .d-md-table-row { + display: table-row !important; + } + + .d-md-table-cell { + display: table-cell !important; + } + + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 992px) { + .d-lg-none { + display: none !important; + } + + .d-lg-inline { + display: inline !important; + } + + .d-lg-inline-block { + display: inline-block !important; + } + + .d-lg-block { + display: block !important; + } + + .d-lg-table { + display: table !important; + } + + .d-lg-table-row { + display: table-row !important; + } + + .d-lg-table-cell { + display: table-cell !important; + } + + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; + } + + .d-xl-inline { + display: inline !important; + } + + .d-xl-inline-block { + display: inline-block !important; + } + + .d-xl-block { + display: block !important; + } + + .d-xl-table { + display: table !important; + } + + .d-xl-table-row { + display: table-row !important; + } + + .d-xl-table-cell { + display: table-cell !important; + } + + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + + .d-print-inline { + display: inline !important; + } + + .d-print-inline-block { + display: inline-block !important; + } + + .d-print-block { + display: block !important; + } + + .d-print-table { + display: table !important; + } + + .d-print-table-row { + display: table-row !important; + } + + .d-print-table-cell { + display: table-cell !important; + } + + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } +} +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; +} +.embed-responsive::before { + display: block; + content: ""; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; +} + +.embed-responsive-16by9::before { + padding-top: 56.25%; +} + +.embed-responsive-4by3::before { + padding-top: 75%; +} + +.embed-responsive-1by1::before { + padding-top: 100%; +} + +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} + +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} + +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} + +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} + +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} + +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} + +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} + +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} + +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} + +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} + +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} + +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} + +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} + +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} + +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} + +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} + +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} + +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} + +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} + +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} + +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} + +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} + +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} + +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} + +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} + +.align-self-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; +} + +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} + +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} + +.align-self-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; +} + +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} + +.align-self-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; +} + +@media (min-width: 576px) { + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-sm-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 768px) { + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-md-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-md-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 992px) { + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-lg-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} +@media (min-width: 1200px) { + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + -ms-grid-row-align: auto !important; + align-self: auto !important; + } + + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + + .align-self-xl-center { + -ms-flex-item-align: center !important; + -ms-grid-row-align: center !important; + align-self: center !important; + } + + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + -ms-grid-row-align: stretch !important; + align-self: stretch !important; + } +} +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.float-none { + float: none !important; +} + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; + } + + .float-sm-right { + float: right !important; + } + + .float-sm-none { + float: none !important; + } +} +@media (min-width: 768px) { + .float-md-left { + float: left !important; + } + + .float-md-right { + float: right !important; + } + + .float-md-none { + float: none !important; + } +} +@media (min-width: 992px) { + .float-lg-left { + float: left !important; + } + + .float-lg-right { + float: right !important; + } + + .float-lg-none { + float: none !important; + } +} +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; + } + + .float-xl-right { + float: right !important; + } + + .float-xl-none { + float: none !important; + } +} +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +@supports ((position: -webkit-sticky) or (position: sticky)) { + .sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; +} + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.vw-100 { + width: 100vw !important; +} + +.vh-100 { + height: 100vh !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + pointer-events: auto; + content: ""; + background-color: rgba(0, 0, 0, 0); +} + +.m-0 { + margin: 0 !important; +} + +.mt-0, +.my-0 { + margin-top: 0 !important; +} + +.mr-0, +.mx-0 { + margin-right: 0 !important; +} + +.mb-0, +.my-0 { + margin-bottom: 0 !important; +} + +.ml-0, +.mx-0 { + margin-left: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; +} + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; +} + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; +} + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; +} + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.mt-3, +.my-3 { + margin-top: 1rem !important; +} + +.mr-3, +.mx-3 { + margin-right: 1rem !important; +} + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; +} + +.ml-3, +.mx-3 { + margin-left: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; +} + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; +} + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; +} + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.mt-5, +.my-5 { + margin-top: 3rem !important; +} + +.mr-5, +.mx-5 { + margin-right: 3rem !important; +} + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; +} + +.ml-5, +.mx-5 { + margin-left: 3rem !important; +} + +.p-0 { + padding: 0 !important; +} + +.pt-0, +.py-0 { + padding-top: 0 !important; +} + +.pr-0, +.px-0 { + padding-right: 0 !important; +} + +.pb-0, +.py-0 { + padding-bottom: 0 !important; +} + +.pl-0, +.px-0 { + padding-left: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; +} + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; +} + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; +} + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; +} + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.pt-3, +.py-3 { + padding-top: 1rem !important; +} + +.pr-3, +.px-3 { + padding-right: 1rem !important; +} + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; +} + +.pl-3, +.px-3 { + padding-left: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; +} + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; +} + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; +} + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.pt-5, +.py-5 { + padding-top: 3rem !important; +} + +.pr-5, +.px-5 { + padding-right: 3rem !important; +} + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; +} + +.pl-5, +.px-5 { + padding-left: 3rem !important; +} + +.m-n1 { + margin: -0.25rem !important; +} + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; +} + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; +} + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; +} + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; +} + +.m-n2 { + margin: -0.5rem !important; +} + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; +} + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; +} + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; +} + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; +} + +.m-n3 { + margin: -1rem !important; +} + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; +} + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; +} + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; +} + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; +} + +.m-n4 { + margin: -1.5rem !important; +} + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; +} + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; +} + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; +} + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; +} + +.m-n5 { + margin: -3rem !important; +} + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; +} + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; +} + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; +} + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mt-auto, +.my-auto { + margin-top: auto !important; +} + +.mr-auto, +.mx-auto { + margin-right: auto !important; +} + +.mb-auto, +.my-auto { + margin-bottom: auto !important; +} + +.ml-auto, +.mx-auto { + margin-left: auto !important; +} + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; + } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; + } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; + } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; + } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; + } + + .m-sm-1 { + margin: 0.25rem !important; + } + + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; + } + + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; + } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; + } + + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; + } + + .m-sm-2 { + margin: 0.5rem !important; + } + + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; + } + + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; + } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; + } + + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; + } + + .m-sm-3 { + margin: 1rem !important; + } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; + } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; + } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; + } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; + } + + .m-sm-4 { + margin: 1.5rem !important; + } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; + } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; + } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; + } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; + } + + .m-sm-5 { + margin: 3rem !important; + } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; + } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; + } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; + } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; + } + + .p-sm-0 { + padding: 0 !important; + } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; + } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; + } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; + } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; + } + + .p-sm-1 { + padding: 0.25rem !important; + } + + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; + } + + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; + } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; + } + + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; + } + + .p-sm-2 { + padding: 0.5rem !important; + } + + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; + } + + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; + } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; + } + + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; + } + + .p-sm-3 { + padding: 1rem !important; + } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; + } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; + } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; + } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; + } + + .p-sm-4 { + padding: 1.5rem !important; + } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; + } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; + } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; + } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; + } + + .p-sm-5 { + padding: 3rem !important; + } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; + } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; + } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; + } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; + } + + .m-sm-n1 { + margin: -0.25rem !important; + } + + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; + } + + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; + } + + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; + } + + .m-sm-n2 { + margin: -0.5rem !important; + } + + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; + } + + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; + } + + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; + } + + .m-sm-n3 { + margin: -1rem !important; + } + + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; + } + + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; + } + + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; + } + + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; + } + + .m-sm-n4 { + margin: -1.5rem !important; + } + + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; + } + + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; + } + + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; + } + + .m-sm-n5 { + margin: -3rem !important; + } + + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; + } + + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; + } + + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; + } + + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; + } + + .m-sm-auto { + margin: auto !important; + } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; + } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; + } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; + } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; + } +} +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; + } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; + } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; + } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; + } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; + } + + .m-md-1 { + margin: 0.25rem !important; + } + + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; + } + + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; + } + + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; + } + + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; + } + + .m-md-2 { + margin: 0.5rem !important; + } + + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; + } + + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; + } + + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; + } + + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; + } + + .m-md-3 { + margin: 1rem !important; + } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; + } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; + } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; + } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; + } + + .m-md-4 { + margin: 1.5rem !important; + } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; + } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; + } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; + } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; + } + + .m-md-5 { + margin: 3rem !important; + } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; + } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; + } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; + } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; + } + + .p-md-0 { + padding: 0 !important; + } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; + } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; + } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; + } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; + } + + .p-md-1 { + padding: 0.25rem !important; + } + + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; + } + + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; + } + + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; + } + + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; + } + + .p-md-2 { + padding: 0.5rem !important; + } + + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; + } + + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; + } + + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; + } + + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; + } + + .p-md-3 { + padding: 1rem !important; + } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; + } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; + } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; + } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; + } + + .p-md-4 { + padding: 1.5rem !important; + } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; + } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; + } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; + } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; + } + + .p-md-5 { + padding: 3rem !important; + } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; + } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; + } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; + } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; + } + + .m-md-n1 { + margin: -0.25rem !important; + } + + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; + } + + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; + } + + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; + } + + .m-md-n2 { + margin: -0.5rem !important; + } + + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; + } + + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; + } + + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; + } + + .m-md-n3 { + margin: -1rem !important; + } + + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; + } + + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; + } + + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; + } + + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; + } + + .m-md-n4 { + margin: -1.5rem !important; + } + + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; + } + + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; + } + + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; + } + + .m-md-n5 { + margin: -3rem !important; + } + + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; + } + + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; + } + + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; + } + + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; + } + + .m-md-auto { + margin: auto !important; + } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; + } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; + } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; + } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; + } +} +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; + } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; + } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; + } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; + } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; + } + + .m-lg-1 { + margin: 0.25rem !important; + } + + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; + } + + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; + } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; + } + + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; + } + + .m-lg-2 { + margin: 0.5rem !important; + } + + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; + } + + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; + } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; + } + + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; + } + + .m-lg-3 { + margin: 1rem !important; + } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; + } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; + } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; + } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; + } + + .m-lg-4 { + margin: 1.5rem !important; + } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; + } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; + } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; + } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; + } + + .m-lg-5 { + margin: 3rem !important; + } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; + } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; + } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; + } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; + } + + .p-lg-0 { + padding: 0 !important; + } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; + } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; + } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; + } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; + } + + .p-lg-1 { + padding: 0.25rem !important; + } + + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; + } + + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; + } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; + } + + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; + } + + .p-lg-2 { + padding: 0.5rem !important; + } + + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; + } + + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; + } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; + } + + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; + } + + .p-lg-3 { + padding: 1rem !important; + } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; + } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; + } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; + } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; + } + + .p-lg-4 { + padding: 1.5rem !important; + } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; + } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; + } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; + } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; + } + + .p-lg-5 { + padding: 3rem !important; + } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; + } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; + } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; + } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; + } + + .m-lg-n1 { + margin: -0.25rem !important; + } + + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; + } + + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; + } + + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; + } + + .m-lg-n2 { + margin: -0.5rem !important; + } + + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; + } + + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; + } + + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; + } + + .m-lg-n3 { + margin: -1rem !important; + } + + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; + } + + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; + } + + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; + } + + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; + } + + .m-lg-n4 { + margin: -1.5rem !important; + } + + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; + } + + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; + } + + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; + } + + .m-lg-n5 { + margin: -3rem !important; + } + + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; + } + + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; + } + + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; + } + + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; + } + + .m-lg-auto { + margin: auto !important; + } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; + } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; + } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; + } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; + } +} +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; + } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; + } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; + } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; + } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; + } + + .m-xl-1 { + margin: 0.25rem !important; + } + + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; + } + + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; + } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; + } + + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; + } + + .m-xl-2 { + margin: 0.5rem !important; + } + + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; + } + + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; + } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; + } + + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; + } + + .m-xl-3 { + margin: 1rem !important; + } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; + } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; + } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; + } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; + } + + .m-xl-4 { + margin: 1.5rem !important; + } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; + } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; + } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; + } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; + } + + .m-xl-5 { + margin: 3rem !important; + } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; + } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; + } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; + } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; + } + + .p-xl-0 { + padding: 0 !important; + } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; + } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; + } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; + } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; + } + + .p-xl-1 { + padding: 0.25rem !important; + } + + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; + } + + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; + } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; + } + + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; + } + + .p-xl-2 { + padding: 0.5rem !important; + } + + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; + } + + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; + } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; + } + + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; + } + + .p-xl-3 { + padding: 1rem !important; + } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; + } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; + } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; + } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; + } + + .p-xl-4 { + padding: 1.5rem !important; + } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; + } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; + } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; + } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; + } + + .p-xl-5 { + padding: 3rem !important; + } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; + } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; + } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; + } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; + } + + .m-xl-n1 { + margin: -0.25rem !important; + } + + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; + } + + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; + } + + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; + } + + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; + } + + .m-xl-n2 { + margin: -0.5rem !important; + } + + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; + } + + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; + } + + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; + } + + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; + } + + .m-xl-n3 { + margin: -1rem !important; + } + + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; + } + + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; + } + + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; + } + + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; + } + + .m-xl-n4 { + margin: -1.5rem !important; + } + + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; + } + + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; + } + + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; + } + + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; + } + + .m-xl-n5 { + margin: -3rem !important; + } + + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; + } + + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; + } + + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; + } + + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; + } + + .m-xl-auto { + margin: auto !important; + } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; + } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; + } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; + } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; + } +} +.text-monospace { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +@media (min-width: 576px) { + .text-sm-left { + text-align: left !important; + } + + .text-sm-right { + text-align: right !important; + } + + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .text-md-left { + text-align: left !important; + } + + .text-md-right { + text-align: right !important; + } + + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .text-lg-left { + text-align: left !important; + } + + .text-lg-right { + text-align: right !important; + } + + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .text-xl-left { + text-align: left !important; + } + + .text-xl-right { + text-align: right !important; + } + + .text-xl-center { + text-align: center !important; + } +} +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-lighter { + font-weight: lighter !important; +} + +.font-weight-normal { + font-weight: 400 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-bolder { + font-weight: bolder !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-white { + color: #fff !important; +} + +.text-primary { + color: #007bff !important; +} + +a.text-primary:hover, a.text-primary:focus { + color: #0056b3 !important; +} + +.text-secondary { + color: #6c757d !important; +} + +a.text-secondary:hover, a.text-secondary:focus { + color: #494f54 !important; +} + +.text-success { + color: #28a745 !important; +} + +a.text-success:hover, a.text-success:focus { + color: #19692c !important; +} + +.text-info { + color: #17a2b8 !important; +} + +a.text-info:hover, a.text-info:focus { + color: #0f6674 !important; +} + +.text-warning { + color: #ffc107 !important; +} + +a.text-warning:hover, a.text-warning:focus { + color: #ba8b00 !important; +} + +.text-danger { + color: #dc3545 !important; +} + +a.text-danger:hover, a.text-danger:focus { + color: #a71d2a !important; +} + +.text-light { + color: #f8f9fa !important; +} + +a.text-light:hover, a.text-light:focus { + color: #cbd3da !important; +} + +.text-dark { + color: #343a40 !important; +} + +a.text-dark:hover, a.text-dark:focus { + color: #121416 !important; +} + +.text-body { + color: #212529 !important; +} + +.text-muted { + color: #6c757d !important; +} + +.text-black-50 { + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-break { + word-break: break-word !important; + overflow-wrap: break-word !important; +} + +.text-reset { + color: inherit !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} diff --git a/libretube-theme/static/css/styles.css b/libretube-theme/static/css/styles.css new file mode 100644 index 0000000..2054995 --- /dev/null +++ b/libretube-theme/static/css/styles.css @@ -0,0 +1,851 @@ +/*! + * Author: jesus e. + * Version: 1.2.10 + */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local("Open Sans Regular"), local("OpenSans-Regular"), url(../fonts/opensans/latin.woff2) format("woff2"); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +body { + font-family: 'Open Sans', sans-serif; + color: #fff; + background: #111; + overflow-x: hidden; +} + +p { + line-height: 24px; + font-size: 14px; +} + +a { + text-decoration: none; + color: #007bff; +} +a:hover { + color: #0091EA; + text-decoration: none; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} + +.hr-author { + margin: 10px 0; +} + +a.link-author { + color: #fff; +} +a.link-author:hover { + color: #fff; +} + +.style-scope svg { + width: 0.8rem; + height: 0.8rem; + fill: #555; +} + +ul { + padding: 0; +} + +hr { + width: 100%; + height: 1px; + background-color: #222; + border: none; + margin: 30px 0; +} + +h2, h3, h4, h5, h6 { + margin: 0; + padding: 0; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +h1 { + margin-top: 1rem; + font-size: 1rem; + font-weight: 700; +} + +summary { + font-weight: 700; + margin-top: 1rem; + margin-bottom: 1rem; + text-transform: uppercase; + font-size: .8rem; +} + +.button { + background-color: #0091EA; + color: #fff; + padding: 17px 25px; + text-transform: uppercase; + font-weight: 700; + font-size: 12px; + border: 2px solid #0091EA; + float: left; + border-radius: 999px; +} +.button:hover { + background-color: #fff; + color: #0288D1; + border: 2px solid #0288D1; + text-decoration: none; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} + +.clear { + clear: both; +} + +video { + width: 100%; +} + +/* plyr fix */ +.plyr:-moz-full-screen video { + max-height: initial; +} +.plyr:-webkit-full-screen video { + max-height: initial; +} +.plyr:-ms-fullscreen video { + max-height: initial; +} +.plyr:fullscreen video { + max-height: initial; +} + +.plyr video { + max-height: 480px; +} + +/* highlight search */ +.highlighted { + background: #0091EA; + display: inline-block; + font-weight: bold; + padding: 0 6px; +} + +/* Code */ +code { + background-color: #282828; + color: #73d1ed; +} + +pre { + background-color: #282828; + color: #78dcfa; + padding: 1rem; +} + +/* Colors Code */ +.highlight { + background: #000000; + color: #cccccc; +} +.highlight pre { + font-size: 75%; +} +.highlight .hll { + background-color: #222222; +} +.highlight .c { + color: #4E4F8E; +} +.highlight .err { + color: #cccccc; + border: 1px solid #FF0000; +} +.highlight .esc, .highlight .g { + color: #cccccc; +} +.highlight .k { + color: #cdcd00; +} +.highlight .l, .highlight .n { + color: #cccccc; +} +.highlight .o { + color: #3399cc; +} +.highlight .x { + color: #cccccc; +} +.highlight .p { + color: #fac0ba; +} +.highlight .ch, .highlight .cm, .highlight .cp, .highlight .cpf, .highlight .c1 { + color: #4E4F8E; +} +.highlight .cs { + color: #cd0000; + font-weight: bold; +} +.highlight .gd { + color: #cd0000; +} +.highlight .ge { + color: #cccccc; + font-style: italic; +} +.highlight .gr { + color: #FF0000; +} +.highlight .gh { + color: #4E4F8E; + font-weight: bold; +} +.highlight .gi { + color: #00cd00; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #4E4F8E; + font-weight: bold; +} +.highlight .gs { + color: #cccccc; + font-weight: bold; +} +.highlight .gu { + color: #800080; + font-weight: bold; +} +.highlight .gt { + color: #0044DD; +} +.highlight .kc { + color: #cdcd00; +} +.highlight .kd { + color: #00cd00; +} +.highlight .kn { + color: #cd00cd; +} +.highlight .kp, .highlight .kr { + color: #cdcd00; +} +.highlight .kt { + color: #00cd00; +} +.highlight .ld { + color: #cccccc; +} +.highlight .m { + color: #cd00cd; +} +.highlight .s { + color: #cd0000; +} +.highlight .na { + color: #cccccc; +} +.highlight .nb { + color: #cd00cd; +} +.highlight .nc { + color: #00cdcd; +} +.highlight .no, .highlight .nd, .highlight .ni { + color: #cccccc; +} +.highlight .ne { + color: #666699; + font-weight: bold; +} +.highlight .nf, .highlight .nl, .highlight .nn, .highlight .nx, .highlight .py { + color: #cccccc; +} +.highlight .nt { + color: orange; +} +.highlight .nv { + color: #00cdcd; +} +.highlight .ow { + color: #cdcd00; +} +.highlight .w { + color: #cccccc; +} +.highlight .mb, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .mo { + color: #cd00cd; +} +.highlight .sb, .highlight .sc, .highlight .sd, .highlight .s2, .highlight .se, .highlight .sh, .highlight .si, .highlight .sx, .highlight .sr, .highlight .s1, .highlight .ss { + color: #cd0000; +} +.highlight .bp { + color: #cd00cd; +} +.highlight .vc, .highlight .vg, .highlight .vi { + color: #00cdcd; +} +.highlight .il { + color: #cd00cd; +} + +/* Header */ +header { + background: #222; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 4; +} + +.logo { + max-width: 60%; +} + +#menu-toggle { + position: relative; + color: white; +} +#menu-toggle img { + width: 20px; +} + +.menu-bars { + left: 1rem; +} + +.menu-logo { + position: relative; + left: 2rem; +} + +input { + border: 1px solid #000; + color: #fff; + font-size: 12px; + padding: 0.5rem 1rem; + width: 100%; + background: url(../images/search.png) #111 no-repeat right 35px center; + background-size: 3%; + outline: none; +} + +.notifications { + display: -ms-flexbox; + display: flex; + margin: 0px; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; +} +.notifications li { + list-style: none; +} +.notifications li:hover { + cursor: pointer; +} +.notifications i { + color: #bbc3ca; + font-size: 20px; + margin: 0rem 0.2rem; +} +.notifications span { + border-radius: 50px; + background-color: #0091EA; + color: #fff; + font-weight: 700; + padding: 4px 9px; + font-size: 11px; + position: relative; + top: -12px; + left: -12px; +} + +/* Menu-profile */ +.menu-profile { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: end; + justify-content: flex-end; + -ms-flex-align: center; + align-items: center; +} +.menu-profile ul { + display: -ms-inline-flexbox; + display: inline-flex; + list-style: none; + margin-bottom: 0px; +} + +.image-profile-menu { + width: 1rem; +} +.image-profile-menu img { + width: 100%; +} + +.log-out a { + background: #0091EA; + color: white; + padding: .2rem; + font-size: .8rem; + font-weight: 700; +} +.log-out a:hover { + color: white; +} + +/*----------------------*/ +.username { + color: #fff; + font-weight: 700; +} + +/* header mt-6 */ +.mt-6, .my-6 { + margin-top: 6rem !important; +} + +/* Tabs */ +.tab { + text-align: center; + margin: -10px 0; +} +.tab li { + display: inline-block; + text-transform: uppercase; + color: #808791; + font-weight: 700; + font-size: 12px; + margin: 0 20px; +} +.tab li:hover { + color: #0091EA; + cursor: pointer; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} +.tab li > a { + color: white; +} +.tab .active { + border-bottom: 3px solid #0091EA; + padding-bottom: 20px; + margin-bottom: -20px; + color: #fff; +} + +/* Main Content */ +details { + font-size: 14px; +} +details > ul, details > ol { + margin-left: 1rem; +} + +caption { + color: #fff; + caption-side: top; +} + +.main-videos h2 { + margin: 0px 0px 0px 0px; + font-weight: 900; + font-size: 1rem; + text-align: center; +} +.main-videos h2 > a { + color: white; +} + +.area { + position: relative; + margin-bottom: 0.5rem; +} + +.duration { + background-color: #000; + color: #fff; + padding: 2px 5px; + text-transform: uppercase; + font-weight: 700; + font-size: 12px; + position: absolute; + right: 0; + bottom: .2rem; +} + +p.views { + color: #343434; +} + +.video p { + margin: 0; + padding: 0; + color: #757a80; + line-height: inherit; +} + +.area:hover .mask { + display: block; + cursor: pointer; + opacity: 100; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} + +.vertical-align { + position: relative; + top: 50%; + transform: translateY(-50%); + -webkit-transform: translateY(-50%); + -ms-transform: translateY(-50%); +} + +.mask { + position: absolute; + background-color: rgba(17, 17, 17, 0.5); + width: 100%; + height: 100%; + text-align: center; + opacity: 0; +} +.mask p { + color: #fff; + font-weight: 700; +} +.mask i { + color: #fff; +} + +.mini { + list-style: none; +} +.mini h4 { + margin-top: 13px; + font-weight: 700; +} +.mini p { + font-size: 12px; + margin-top: 6px; +} +.mini .duration { + padding: 2px 5px; +} +.mini .mask p { + display: none; +} +.mini .soumaicon.play svg { + width: 3rem; + height: 3rem; +} + +li.mini:nth-child(2) { + margin-bottom: 30px; +} + +.video h4 { + margin-top: 15px; + font-weight: 400; + text-align: center; +} + +.single-channel .video p { + margin-top: 7px; +} + +/* Channel Information Section */ +.channel-bio hr { + margin: 20px 0; +} +.channel-bio p { + text-align: justify; +} +.channel-bio .button { + margin-top: 10px; +} + +.channel-name { + font-weight: 500; + font-size: 16px; +} +.channel-name img { + margin-right: 10px; +} + +/* Pagination */ +.page-item:first-child .page-link > span, .page-item:last-child .page-link > span { + color: white; +} + +.page-link { + background-color: #222; + border: 1px solid #111; + color: #fff; +} + +.page-item.disabled .page-link { + pointer-events: none; + cursor: auto; + background-color: #111; + border-color: #222; +} + +.page-link:hover { + text-decoration: none; + background-color: #0091EA; + border: solid 1px #026de0; + color: #fff; +} + +.page-item.active .page-link { + color: #fff; + background-color: #0091EA; + border-color: #0091EA; +} + +/* Footer */ +footer { + text-align: center; + padding: 0 0 30px; +} +footer li { + display: inline; + margin: 0 15px; +} +footer ul:nth-child(1) a { + font-size: 16px; + font-weight: 600; + color: #fff; +} +footer ul:nth-child(2) { + margin: 20px 0; +} +footer ul:nth-child(2) a { + color: #f5f5f5; +} +footer li a:hover { + color: #0091EA; + text-decoration: none; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} +footer > h4, footer > h6 { + color: #aaa7a7; + font-weight: 300; +} + +/* Sidebar */ +.title { + color: #00A5FF; + text-transform: uppercase; + font-weight: 700; +} + +.sidebar { + margin-top: 0px; + /* Adjust vertical columm with menu-bar */ +} +.sidebar ul { + margin-bottom: 5px; + list-style: none; +} +.sidebar li { + line-height: 40px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.sidebar a { + color: #828c95; + font-weight: 500; +} +.sidebar a:hover { + color: #0091EA; + text-decoration: none; +} +.sidebar i { + font-size: 20px; + margin-right: 15px; +} +.sidebar #subs img { + margin-right: 15px; + width: 25px; +} + +#playlist p { + font-size: 12px; + font-weight: 300; + margin-left: 35px; + margin-top: -15px; +} +#playlist i { + float: left; +} + +#sidebar-wrapper { + padding-top: 10px; + padding-left: 30px; + padding-right: 30px; + margin-bottom: -10px; + font-weight: 600; + font-size: 14px; + background-color: #111; + border-right: 1px solid #dbdee0; + top: 0; + bottom: 0; + z-index: 1000; + left: 0; + position: fixed; + width: 300px; + margin-left: -300px; + overflow-x: hidden; + overflow-y: hidden; + transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -webkit-transition: all 0.3s ease-in-out; +} +#sidebar-wrapper.active { + left: 300px; + width: 300px; +} + +#menu-close { + padding: 7px 0; +} +#menu-close img { + width: 10px; +} + +/* Main */ +h2.title-video { + margin-left: 1rem; +} + +soumaicon { + display: -ms-inline-flexbox; + display: inline-flex; + -ms-flex-line-pack: center; + align-content: center; +} + +/*------ play icon -------*/ +.soumaicon svg { + width: 1rem; + height: 1rem; + fill: currentcolor; +} +.soumaicon:hover svg { + fill: #0091EA; +} +.soumaicon.play svg { + width: 4rem; + height: 4rem; +} +.soumaicon.play:hover svg { + fill: currentcolor; +} + +/*------- End play -------*/ +@media only screen and (max-width: 991px) { + .logo { + max-width: 15%; + margin: .5rem 0; + } + + .menu-profile { + -ms-flex-pack: center; + justify-content: center; + } + + .mt-8 { + margin-top: 8rem !important; + } + + .mt-10 { + margin-top: 10rem !important; + } +} +@media screen and (max-width: 525px) { + .tab .active { + border-bottom: 2px solid #0091EA; + padding-bottom: 1px; + margin-bottom: 5px; + } +} +@media only screen and (max-width: 480px) { + .logo { + max-width: 20%; + } + + .channel-bio .button { + margin-bottom: 1rem; + } + + ul#user-info { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: center; + align-items: center; + } + + .notifications { + position: relative; + right: 0px; + top: 0px; + left: 0px; + margin: 20px; + } + + .ml-1 { + margin-left: -15px !important; + } + + .mt-8, .mt-10 { + margin-top: 1rem !important; + } + + .fixed-top { + position: relative; + top: 0; + right: 0; + left: 0; + z-index: 3; + } +} diff --git a/libretube-theme/static/fonts/opensans/latin.woff2 b/libretube-theme/static/fonts/opensans/latin.woff2 new file mode 100644 index 0000000..e9f58b7 Binary files /dev/null and b/libretube-theme/static/fonts/opensans/latin.woff2 differ diff --git a/libretube-theme/static/images/favicon/favicon-16x16.png b/libretube-theme/static/images/favicon/favicon-16x16.png new file mode 100644 index 0000000..f10facf Binary files /dev/null and b/libretube-theme/static/images/favicon/favicon-16x16.png differ diff --git a/libretube-theme/static/images/favicon/favicon-192x192.png b/libretube-theme/static/images/favicon/favicon-192x192.png new file mode 100644 index 0000000..9a0e4ec Binary files /dev/null and b/libretube-theme/static/images/favicon/favicon-192x192.png differ diff --git a/libretube-theme/static/images/favicon/favicon-32x32.png b/libretube-theme/static/images/favicon/favicon-32x32.png new file mode 100644 index 0000000..efae001 Binary files /dev/null and b/libretube-theme/static/images/favicon/favicon-32x32.png differ diff --git a/libretube-theme/static/images/favicon/favicon-96x96.png b/libretube-theme/static/images/favicon/favicon-96x96.png new file mode 100644 index 0000000..e4b3054 Binary files /dev/null and b/libretube-theme/static/images/favicon/favicon-96x96.png differ diff --git a/libretube-theme/static/images/logo.svg b/libretube-theme/static/images/logo.svg new file mode 100644 index 0000000..597d419 --- /dev/null +++ b/libretube-theme/static/images/logo.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + diff --git a/libretube-theme/static/images/profile.png b/libretube-theme/static/images/profile.png new file mode 100644 index 0000000..6257a93 Binary files /dev/null and b/libretube-theme/static/images/profile.png differ diff --git a/libretube-theme/static/images/search.png b/libretube-theme/static/images/search.png new file mode 100644 index 0000000..e3b285c Binary files /dev/null and b/libretube-theme/static/images/search.png differ diff --git a/libretube-theme/static/images/svg/master.svg b/libretube-theme/static/images/svg/master.svg new file mode 100644 index 0000000..51dcf89 --- /dev/null +++ b/libretube-theme/static/images/svg/master.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/libretube-theme/static/images/video.png b/libretube-theme/static/images/video.png new file mode 100644 index 0000000..17ba261 Binary files /dev/null and b/libretube-theme/static/images/video.png differ diff --git a/libretube-theme/static/images/videocamera.svg b/libretube-theme/static/images/videocamera.svg new file mode 100644 index 0000000..c7f45d5 --- /dev/null +++ b/libretube-theme/static/images/videocamera.svg @@ -0,0 +1,19 @@ + + + + + + diff --git a/libretube-theme/static/js/play.js b/libretube-theme/static/js/play.js new file mode 100644 index 0000000..6655e8a --- /dev/null +++ b/libretube-theme/static/js/play.js @@ -0,0 +1,21 @@ +// @license magnet:?xt=urn:btih:1f739d935676111cfff4b4693e3816e664797050&dn=gpl-3.0.txt GPL-v3-or-Later +const player = new Plyr('#player-ply', { + captions: { active: true, language: 'es' }, + controls: [ + 'play-large', + 'play', + 'progress', + 'current-time', + 'duration', + 'mute', + 'volume', + 'captions', + 'settings', + 'download', + 'fullscreen' + ], + iconUrl: "/theme/modules/plyr/plyr.svg", + blankVideo: "/theme/modules/plyr/blank.webm", + debug: false, +}); +// @license-end diff --git a/libretube-theme/static/modules/plyr/blank.webm b/libretube-theme/static/modules/plyr/blank.webm new file mode 100644 index 0000000..6ec17ef Binary files /dev/null and b/libretube-theme/static/modules/plyr/blank.webm differ diff --git a/libretube-theme/static/modules/plyr/plyr.css b/libretube-theme/static/modules/plyr/plyr.css new file mode 100644 index 0000000..7d98f20 --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.css @@ -0,0 +1 @@ +@keyframes plyr-progress{to{background-position:25px 0;background-position:var(--plyr-progress-loading-size,25px) 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:400;font-weight:var(--plyr-font-weight-regular,400);height:100%;line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,9px);line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;display:none;font-size:13px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:15px;font-size:var(--plyr-font-size-base,15px);padding:calc(10px * 2);padding:calc(var(--plyr-control-spacing,10px) * 2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(calc(10px * -4));transform:translateY(calc(var(--plyr-control-spacing,10px) * -4))}.plyr__caption{background:rgba(0,0,0,.8);background:var(--plyr-captions-background,rgba(0,0,0,.8));border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:0 0;border:0;border-radius:3px;border-radius:var(--plyr-control-radius,3px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:calc(10px / 4);margin-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:calc(10px / 4);padding-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 calc(10px / 2);padding:0 calc(var(--plyr-control-spacing,10px)/ 2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls:empty{display:none}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);background:var(--plyr-menu-background,rgba(255,255,255,.9));border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-menu-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:15px;font-size:var(--plyr-font-size-base,15px);margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border:var(--plyr-menu-arrow-size,4px) solid transparent;border-top-color:rgba(255,255,255,.9);border-top-color:var(--plyr-menu-background,rgba(255,255,255,.9));content:'';height:0;position:absolute;right:calc(((18px / 2) + calc(10px * .7)) - (4px / 2));right:calc(((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7)) - (var(--plyr-menu-arrow-size,4px)/ 2));top:100%;width:0}.plyr__menu__container [role=menu]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7)}.plyr__menu__container [role=menucaptions]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);max-height:320px;overflow-y:auto}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding-bottom:calc(calc(10px * .7)/ 1.5);padding-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);padding-left:calc(calc(10px * .7) * 1.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-right:calc(calc(10px * .7) * 1.5);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-top:calc(calc(10px * .7)/ 1.5);padding-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);-webkit-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;border:var(--plyr-menu-item-arrow-size,4px) solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:calc(calc(10px * .7) * 4);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4)}.plyr__menu__container .plyr__control--forward::after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:calc((calc(10px * .7) * 1.5) - 4px);right:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:400;font-weight:var(--plyr-font-weight-regular,400);margin:calc(10px * .7);margin:calc(var(--plyr-control-spacing,10px) * .7);margin-bottom:calc(calc(10px * .7)/ 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);padding-left:calc(calc(10px * .7) * 4);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4);position:relative;width:calc(100% - (calc(10px * .7) * 2));width:calc(100% - (calc(var(--plyr-control-spacing,10px) * .7) * 2))}.plyr__menu__container .plyr__control--back::after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:calc((calc(10px * .7) * 1.5) - 4px);left:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--back::before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:'';height:1px;left:0;margin-top:calc(calc(10px * .7)/ 2);margin-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:calc(10px * .7);padding-left:calc(var(--plyr-control-spacing,10px) * .7)}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;margin-right:var(--plyr-control-spacing,10px);transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff;background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)))}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(35,40,47,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:calc((calc(10px * .7) - 2) * -1);margin-right:calc((calc(var(--plyr-control-spacing,10px) * .7) - 2) * -1);overflow:hidden;padding-left:calc(calc(10px * .7) * 3.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 3.5);pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:calc(13px * 2);border-radius:calc(var(--plyr-range-thumb-height,13px) * 2);color:#00b3ff;color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));display:block;height:calc((3px * 2) + 13px);height:calc((var(--plyr-range-thumb-active-shadow-width,3px) * 2) + var(--plyr-range-thumb-height,13px));margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor 0,transparent 0);background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);-webkit-appearance:none;margin-top:calc(((13px - 5px)/ 2) * -1);margin-top:calc(((var(--plyr-range-thumb-height,13px) - var(--plyr-range-track-height,5px))/ 2) * -1)}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:calc(768px - 1)){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:rgba(255,255,255,.9);background:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;border-radius:var(--plyr-tooltip-radius,3px);bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-small,13px);font-weight:400;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:calc(10px / 2) calc(calc(10px / 2) * 1.5);padding:calc(var(--plyr-control-spacing,10px)/ 2) calc(calc(var(--plyr-control-spacing,10px)/ 2) * 1.5);pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:calc((18px / 2) + calc(10px * .7));left:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7))}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:calc((18px / 2) + calc(10px * .7));right:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7));transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr__progress{left:calc(13px * .5);left:calc(var(--plyr-range-thumb-height,13px) * .5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:calc(13px * -.5);margin-left:calc(var(--plyr-range-thumb-height,13px) * -.5);margin-right:calc(13px * -.5);margin-right:calc(var(--plyr-range-thumb-height,13px) * -.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height,13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:calc((5px / 2) * -1);margin-top:calc((var(--plyr-range-track-height,5px)/ 2) * -1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,40,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,40,47,.6) 50%,rgba(35,40,47,.6) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 25%,transparent 25%,transparent 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr__volume{align-items:center;display:flex;max-width:110px;min-width:80px;position:relative;width:20%}.plyr__volume input[type=range]{margin-left:calc(10px / 2);margin-left:calc(var(--plyr-control-spacing,10px)/ 2);margin-right:calc(10px / 2);margin-right:calc(var(--plyr-control-spacing,10px)/ 2);position:relative;z-index:2}.plyr--is-ios .plyr__volume{min-width:0;width:auto}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--audio .plyr__progress__buffer{color:rgba(193,200,209,.6);color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;left:0;position:absolute;top:0}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75));background:var(--plyr-video-controls-background,linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75)));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:calc(10px / 2);padding:calc(var(--plyr-control-spacing,10px)/ 2);padding-top:calc(10px * 2);padding-top:calc(var(--plyr-control-spacing,10px) * 2);position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:10px;padding:var(--plyr-control-spacing,10px);padding-top:calc(10px * 3.5);padding-top:calc(var(--plyr-control-spacing,10px) * 3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:calc(10px * 1.5);padding:calc(var(--plyr-control-spacing,10px) * 1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--video .plyr__progress__buffer{color:rgba(255,255,255,.25);color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;display:block;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin:-var(--plyr-range-track-height,5px)/2 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);background-color:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:3px;padding:var(--plyr-tooltip-radius,3px);pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);color:#fff;font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important} \ No newline at end of file diff --git a/libretube-theme/static/modules/plyr/plyr.js b/libretube-theme/static/modules/plyr/plyr.js new file mode 100644 index 0000000..d5cc84e --- /dev/null +++ b/libretube-theme/static/modules/plyr/plyr.js @@ -0,0 +1,9320 @@ +typeof navigator === "object" && (function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define('Plyr', factory) : + (global = global || self, global.Plyr = factory()); +}(this, (function () { 'use strict'; + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; + } + + function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; + } + + function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; + } + + function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; + } + + function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) return _arrayLikeToArray(arr); + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + function _iterableToArray(iter) { + if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); + } + + function _iterableToArrayLimit(arr, i) { + if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + function _unsupportedIterableToArray(o, minLen) { + if (!o) return; + if (typeof o === "string") return _arrayLikeToArray(o, minLen); + var n = Object.prototype.toString.call(o).slice(8, -1); + if (n === "Object" && o.constructor) n = o.constructor.name; + if (n === "Map" || n === "Set") return Array.from(o); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + } + + function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) len = arr.length; + + for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; + + return arr2; + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + } + + function _classCallCheck$1(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function"); + } + + function _defineProperties$1(e, t) { + for (var n = 0; n < t.length; n++) { + var r = t[n]; + r.enumerable = r.enumerable || !1, r.configurable = !0, "value" in r && (r.writable = !0), Object.defineProperty(e, r.key, r); + } + } + + function _createClass$1(e, t, n) { + return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e; + } + + function _defineProperty$1(e, t, n) { + return t in e ? Object.defineProperty(e, t, { + value: n, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[t] = n, e; + } + + function ownKeys$1(e, t) { + var n = Object.keys(e); + + if (Object.getOwnPropertySymbols) { + var r = Object.getOwnPropertySymbols(e); + t && (r = r.filter(function (t) { + return Object.getOwnPropertyDescriptor(e, t).enumerable; + })), n.push.apply(n, r); + } + + return n; + } + + function _objectSpread2$1(e) { + for (var t = 1; t < arguments.length; t++) { + var n = null != arguments[t] ? arguments[t] : {}; + t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) { + _defineProperty$1(e, t, n[t]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) { + Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t)); + }); + } + + return e; + } + + var defaults = { + addCSS: !0, + thumbWidth: 15, + watch: !0 + }; + + function matches(e, t) { + return function () { + return Array.from(document.querySelectorAll(t)).includes(this); + }.call(e, t); + } + + function trigger(e, t) { + if (e && t) { + var n = new Event(t, { + bubbles: !0 + }); + e.dispatchEvent(n); + } + } + + var getConstructor = function getConstructor(e) { + return null != e ? e.constructor : null; + }, + instanceOf = function instanceOf(e, t) { + return !!(e && t && e instanceof t); + }, + isNullOrUndefined = function isNullOrUndefined(e) { + return null == e; + }, + isObject = function isObject(e) { + return getConstructor(e) === Object; + }, + isNumber = function isNumber(e) { + return getConstructor(e) === Number && !Number.isNaN(e); + }, + isString = function isString(e) { + return getConstructor(e) === String; + }, + isBoolean = function isBoolean(e) { + return getConstructor(e) === Boolean; + }, + isFunction = function isFunction(e) { + return getConstructor(e) === Function; + }, + isArray = function isArray(e) { + return Array.isArray(e); + }, + isNodeList = function isNodeList(e) { + return instanceOf(e, NodeList); + }, + isElement = function isElement(e) { + return instanceOf(e, Element); + }, + isEvent = function isEvent(e) { + return instanceOf(e, Event); + }, + isEmpty = function isEmpty(e) { + return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length; + }, + is = { + nullOrUndefined: isNullOrUndefined, + object: isObject, + number: isNumber, + string: isString, + boolean: isBoolean, + function: isFunction, + array: isArray, + nodeList: isNodeList, + element: isElement, + event: isEvent, + empty: isEmpty + }; + + function getDecimalPlaces(e) { + var t = "".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); + return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0; + } + + function round(e, t) { + if (1 > t) { + var n = getDecimalPlaces(t); + return parseFloat(e.toFixed(n)); + } + + return Math.round(e / t) * t; + } + + var RangeTouch = function () { + function e(t, n) { + _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init()); + } + + return _createClass$1(e, [{ + key: "init", + value: function value() { + e.enabled && (this.config.addCSS && (this.element.style.userSelect = "none", this.element.style.webKitUserSelect = "none", this.element.style.touchAction = "manipulation"), this.listeners(!0), this.element.rangeTouch = this); + } + }, { + key: "destroy", + value: function value() { + e.enabled && (this.config.addCSS && (this.element.style.userSelect = "", this.element.style.webKitUserSelect = "", this.element.style.touchAction = ""), this.listeners(!1), this.element.rangeTouch = null); + } + }, { + key: "listeners", + value: function value(e) { + var t = this, + n = e ? "addEventListener" : "removeEventListener"; + ["touchstart", "touchmove", "touchend"].forEach(function (e) { + t.element[n](e, function (e) { + return t.set(e); + }, !1); + }); + } + }, { + key: "get", + value: function value(t) { + if (!e.enabled || !is.event(t)) return null; + var n, + r = t.target, + i = t.changedTouches[0], + o = parseFloat(r.getAttribute("min")) || 0, + s = parseFloat(r.getAttribute("max")) || 100, + u = parseFloat(r.getAttribute("step")) || 1, + c = r.getBoundingClientRect(), + a = 100 / c.width * (this.config.thumbWidth / 2) / 100; + return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u); + } + }, { + key: "set", + value: function value(t) { + e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, "touchend" === t.type ? "change" : "input")); + } + }], [{ + key: "setup", + value: function value(t) { + var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {}, + r = null; + if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type="range"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null; + + var i = _objectSpread2$1({}, defaults, {}, n); + + if (is.string(t) && i.watch) { + var o = new MutationObserver(function (n) { + Array.from(n).forEach(function (n) { + Array.from(n.addedNodes).forEach(function (n) { + is.element(n) && matches(n, t) && new e(n, i); + }); + }); + }); + o.observe(document.body, { + childList: !0, + subtree: !0 + }); + } + + return r.map(function (t) { + return new e(t, n); + }); + } + }, { + key: "enabled", + get: function get() { + return "ontouchstart" in document.documentElement; + } + }]), e; + }(); + + // ========================================================================== + // Type checking utils + // ========================================================================== + var getConstructor$1 = function getConstructor(input) { + return input !== null && typeof input !== 'undefined' ? input.constructor : null; + }; + + var instanceOf$1 = function instanceOf(input, constructor) { + return Boolean(input && constructor && input instanceof constructor); + }; + + var isNullOrUndefined$1 = function isNullOrUndefined(input) { + return input === null || typeof input === 'undefined'; + }; + + var isObject$1 = function isObject(input) { + return getConstructor$1(input) === Object; + }; + + var isNumber$1 = function isNumber(input) { + return getConstructor$1(input) === Number && !Number.isNaN(input); + }; + + var isString$1 = function isString(input) { + return getConstructor$1(input) === String; + }; + + var isBoolean$1 = function isBoolean(input) { + return getConstructor$1(input) === Boolean; + }; + + var isFunction$1 = function isFunction(input) { + return getConstructor$1(input) === Function; + }; + + var isArray$1 = function isArray(input) { + return Array.isArray(input); + }; + + var isWeakMap = function isWeakMap(input) { + return instanceOf$1(input, WeakMap); + }; + + var isNodeList$1 = function isNodeList(input) { + return instanceOf$1(input, NodeList); + }; + + var isElement$1 = function isElement(input) { + return instanceOf$1(input, Element); + }; + + var isTextNode = function isTextNode(input) { + return getConstructor$1(input) === Text; + }; + + var isEvent$1 = function isEvent(input) { + return instanceOf$1(input, Event); + }; + + var isKeyboardEvent = function isKeyboardEvent(input) { + return instanceOf$1(input, KeyboardEvent); + }; + + var isCue = function isCue(input) { + return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue); + }; + + var isTrack = function isTrack(input) { + return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind); + }; + + var isPromise = function isPromise(input) { + return instanceOf$1(input, Promise) && isFunction$1(input.then); + }; + + var isEmpty$1 = function isEmpty(input) { + return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length; + }; + + var isUrl = function isUrl(input) { + // Accept a URL object + if (instanceOf$1(input, window.URL)) { + return true; + } // Must be string from here + + + if (!isString$1(input)) { + return false; + } // Add the protocol if required + + + var string = input; + + if (!input.startsWith('http://') || !input.startsWith('https://')) { + string = "http://".concat(input); + } + + try { + return !isEmpty$1(new URL(string).hostname); + } catch (e) { + return false; + } + }; + + var is$1 = { + nullOrUndefined: isNullOrUndefined$1, + object: isObject$1, + number: isNumber$1, + string: isString$1, + boolean: isBoolean$1, + function: isFunction$1, + array: isArray$1, + weakMap: isWeakMap, + nodeList: isNodeList$1, + element: isElement$1, + textNode: isTextNode, + event: isEvent$1, + keyboardEvent: isKeyboardEvent, + cue: isCue, + track: isTrack, + promise: isPromise, + url: isUrl, + empty: isEmpty$1 + }; + + // ========================================================================== + var transitionEndEvent = function () { + var element = document.createElement('span'); + var events = { + WebkitTransition: 'webkitTransitionEnd', + MozTransition: 'transitionend', + OTransition: 'oTransitionEnd otransitionend', + transition: 'transitionend' + }; + var type = Object.keys(events).find(function (event) { + return element.style[event] !== undefined; + }); + return is$1.string(type) ? events[type] : false; + }(); // Force repaint of element + + function repaint(element, delay) { + setTimeout(function () { + try { + // eslint-disable-next-line no-param-reassign + element.hidden = true; // eslint-disable-next-line no-unused-expressions + + element.offsetHeight; // eslint-disable-next-line no-param-reassign + + element.hidden = false; + } catch (e) {// Do nothing + } + }, delay); + } + + // ========================================================================== + // Browser sniffing + // Unfortunately, due to mixed support, UA sniffing is required + // ========================================================================== + var browser = { + isIE: + /* @cc_on!@ */ + !!document.documentMode, + isEdge: window.navigator.userAgent.includes('Edge'), + isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent), + isIPhone: /(iPhone|iPod)/gi.test(navigator.platform), + isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform) + }; + + function cloneDeep(object) { + return JSON.parse(JSON.stringify(object)); + } // Get a nested value in an object + + function getDeep(object, path) { + return path.split('.').reduce(function (obj, key) { + return obj && obj[key]; + }, object); + } // Deep extend destination object with N more objects + + function extend() { + var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + sources[_key - 1] = arguments[_key]; + } + + if (!sources.length) { + return target; + } + + var source = sources.shift(); + + if (!is$1.object(source)) { + return target; + } + + Object.keys(source).forEach(function (key) { + if (is$1.object(source[key])) { + if (!Object.keys(target).includes(key)) { + Object.assign(target, _defineProperty({}, key, {})); + } + + extend(target[key], source[key]); + } else { + Object.assign(target, _defineProperty({}, key, source[key])); + } + }); + return extend.apply(void 0, [target].concat(sources)); + } + + function wrap(elements, wrapper) { + // Convert `elements` to an array, if necessary. + var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the + // first element (see `child` below). + + Array.from(targets).reverse().forEach(function (element, index) { + var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling. + + var parent = element.parentNode; + var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current + // parent). + + child.appendChild(element); // If the element had a sibling, insert the wrapper before + // the sibling to maintain the HTML structure; otherwise, just + // append it to the parent. + + if (sibling) { + parent.insertBefore(child, sibling); + } else { + parent.appendChild(child); + } + }); + } // Set attributes + + function setAttributes(element, attributes) { + if (!is$1.element(element) || is$1.empty(attributes)) { + return; + } // Assume null and undefined attributes should be left out, + // Setting them would otherwise convert them to "null" and "undefined" + + + Object.entries(attributes).filter(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + value = _ref2[1]; + + return !is$1.nullOrUndefined(value); + }).forEach(function (_ref3) { + var _ref4 = _slicedToArray(_ref3, 2), + key = _ref4[0], + value = _ref4[1]; + + return element.setAttribute(key, value); + }); + } // Create a DocumentFragment + + function createElement(type, attributes, text) { + // Create a new + var element = document.createElement(type); // Set all passed attributes + + if (is$1.object(attributes)) { + setAttributes(element, attributes); + } // Add text node + + + if (is$1.string(text)) { + element.innerText = text; + } // Return built element + + + return element; + } // Inaert an element after another + + function insertAfter(element, target) { + if (!is$1.element(element) || !is$1.element(target)) { + return; + } + + target.parentNode.insertBefore(element, target.nextSibling); + } // Insert a DocumentFragment + + function insertElement(type, parent, attributes, text) { + if (!is$1.element(parent)) { + return; + } + + parent.appendChild(createElement(type, attributes, text)); + } // Remove element(s) + + function removeElement(element) { + if (is$1.nodeList(element) || is$1.array(element)) { + Array.from(element).forEach(removeElement); + return; + } + + if (!is$1.element(element) || !is$1.element(element.parentNode)) { + return; + } + + element.parentNode.removeChild(element); + } // Remove all child elements + + function emptyElement(element) { + if (!is$1.element(element)) { + return; + } + + var length = element.childNodes.length; + + while (length > 0) { + element.removeChild(element.lastChild); + length -= 1; + } + } // Replace element + + function replaceElement(newChild, oldChild) { + if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) { + return null; + } + + oldChild.parentNode.replaceChild(newChild, oldChild); + return newChild; + } // Get an attribute object from a string selector + + function getAttributesFromSelector(sel, existingAttributes) { + // For example: + // '.test' to { class: 'test' } + // '#test' to { id: 'test' } + // '[data-test="test"]' to { 'data-test': 'test' } + if (!is$1.string(sel) || is$1.empty(sel)) { + return {}; + } + + var attributes = {}; + var existing = extend({}, existingAttributes); + sel.split(',').forEach(function (s) { + // Remove whitespace + var selector = s.trim(); + var className = selector.replace('.', ''); + var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value + + var parts = stripped.split('='); + + var _parts = _slicedToArray(parts, 1), + key = _parts[0]; + + var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character + + var start = selector.charAt(0); + + switch (start) { + case '.': + // Add to existing classname + if (is$1.string(existing.class)) { + attributes.class = "".concat(existing.class, " ").concat(className); + } else { + attributes.class = className; + } + + break; + + case '#': + // ID selector + attributes.id = selector.replace('#', ''); + break; + + case '[': + // Attribute selector + attributes[key] = value; + break; + } + }); + return extend(existing, attributes); + } // Toggle hidden + + function toggleHidden(element, hidden) { + if (!is$1.element(element)) { + return; + } + + var hide = hidden; + + if (!is$1.boolean(hide)) { + hide = !element.hidden; + } // eslint-disable-next-line no-param-reassign + + + element.hidden = hide; + } // Mirror Element.classList.toggle, with IE compatibility for "force" argument + + function toggleClass(element, className, force) { + if (is$1.nodeList(element)) { + return Array.from(element).map(function (e) { + return toggleClass(e, className, force); + }); + } + + if (is$1.element(element)) { + var method = 'toggle'; + + if (typeof force !== 'undefined') { + method = force ? 'add' : 'remove'; + } + + element.classList[method](className); + return element.classList.contains(className); + } + + return false; + } // Has class name + + function hasClass(element, className) { + return is$1.element(element) && element.classList.contains(className); + } // Element matches selector + + function matches$1(element, selector) { + var _Element = Element, + prototype = _Element.prototype; + + function match() { + return Array.from(document.querySelectorAll(selector)).includes(this); + } + + var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match; + return method.call(element, selector); + } // Closest ancestor element matching selector (also tests element itself) + + function closest(element, selector) { + var _Element2 = Element, + prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill + + function closestElement() { + var el = this; + + do { + if (matches$1.matches(el, selector)) return el; + el = el.parentElement || el.parentNode; + } while (el !== null && el.nodeType === 1); + + return null; + } + + var method = prototype.closest || closestElement; + return method.call(element, selector); + } // Find all elements + + function getElements(selector) { + return this.elements.container.querySelectorAll(selector); + } // Find a single element + + function getElement(selector) { + return this.elements.container.querySelector(selector); + } // Set focus and tab focus class + + function setFocus() { + var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + if (!is$1.element(element)) { + return; + } // Set regular focus + + + element.focus({ + preventScroll: true + }); // If we want to mimic keyboard focus via tab + + if (tabFocus) { + toggleClass(element, this.config.classNames.tabFocus); + } + } + + var defaultCodecs = { + 'audio/ogg': 'vorbis', + 'audio/wav': '1', + 'video/webm': 'vp8, vorbis', + 'video/mp4': 'avc1.42E01E, mp4a.40.2', + 'video/ogg': 'theora' + }; // Check for feature support + + var support = { + // Basic support + audio: 'canPlayType' in document.createElement('audio'), + video: 'canPlayType' in document.createElement('video'), + // Check for support + // Basic functionality vs full UI + check: function check(type, provider, playsinline) { + var canPlayInline = browser.isIPhone && playsinline && support.playsinline; + var api = support[type] || provider !== 'html5'; + var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline); + return { + api: api, + ui: ui + }; + }, + // Picture-in-picture support + // Safari & Chrome only currently + pip: function () { + if (browser.isIPhone) { + return false; + } // Safari + // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls + + + if (is$1.function(createElement('video').webkitSetPresentationMode)) { + return true; + } // Chrome + // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture + + + if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) { + return true; + } + + return false; + }(), + // Airplay support + // Safari only currently + airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent), + // Inline playback support + // https://webkit.org/blog/6784/new-video-policies-for-ios/ + playsinline: 'playsInline' in document.createElement('video'), + // Check for mime type support against a player instance + // Credits: http://diveintohtml5.info/everything.html + // Related: http://www.leanbackplayer.com/test/h5mt.html + mime: function mime(input) { + if (is$1.empty(input)) { + return false; + } + + var _input$split = input.split('/'), + _input$split2 = _slicedToArray(_input$split, 1), + mediaType = _input$split2[0]; + + var type = input; // Verify we're using HTML5 and there's no media type mismatch + + if (!this.isHTML5 || mediaType !== this.type) { + return false; + } // Add codec if required + + + if (Object.keys(defaultCodecs).includes(type)) { + type += "; codecs=\"".concat(defaultCodecs[input], "\""); + } + + try { + return Boolean(type && this.media.canPlayType(type).replace(/no/, '')); + } catch (e) { + return false; + } + }, + // Check for textTracks support + textTracks: 'textTracks' in document.createElement('video'), + // Sliders + rangeInput: function () { + var range = document.createElement('input'); + range.type = 'range'; + return range.type === 'range'; + }(), + // Touch + // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event + touch: 'ontouchstart' in document.documentElement, + // Detect transitions support + transitions: transitionEndEvent !== false, + // Reduced motion iOS & MacOS setting + // https://webkit.org/blog/7551/responsive-design-for-motion/ + reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches + }; + + // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md + // https://www.youtube.com/watch?v=NPM6172J22g + + var supportsPassiveListeners = function () { + // Test via a getter in the options object to see if the passive property is accessed + var supported = false; + + try { + var options = Object.defineProperty({}, 'passive', { + get: function get() { + supported = true; + return null; + } + }); + window.addEventListener('test', null, options); + window.removeEventListener('test', null, options); + } catch (e) {// Do nothing + } + + return supported; + }(); // Toggle event listener + + + function toggleListener(element, event, callback) { + var _this = this; + + var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; + var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true; + var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false; + + // Bail if no element, event, or callback + if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) { + return; + } // Allow multiple events + + + var events = event.split(' '); // Build options + // Default to just the capture boolean for browsers with no passive listener support + + var options = capture; // If passive events listeners are supported + + if (supportsPassiveListeners) { + options = { + // Whether the listener can be passive (i.e. default never prevented) + passive: passive, + // Whether the listener is a capturing listener or not + capture: capture + }; + } // If a single node is passed, bind the event listener + + + events.forEach(function (type) { + if (_this && _this.eventListeners && toggle) { + // Cache event listener + _this.eventListeners.push({ + element: element, + type: type, + callback: callback, + options: options + }); + } + + element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options); + }); + } // Bind event handler + + function on(element) { + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var callback = arguments.length > 2 ? arguments[2] : undefined; + var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + toggleListener.call(this, element, events, callback, true, passive, capture); + } // Unbind event handler + + function off(element) { + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var callback = arguments.length > 2 ? arguments[2] : undefined; + var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + toggleListener.call(this, element, events, callback, false, passive, capture); + } // Bind once-only event handler + + function once(element) { + var _this2 = this; + + var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var callback = arguments.length > 2 ? arguments[2] : undefined; + var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; + var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + var onceCallback = function onceCallback() { + off(element, events, onceCallback, passive, capture); + + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + callback.apply(_this2, args); + }; + + toggleListener.call(this, element, events, onceCallback, true, passive, capture); + } // Trigger event + + function triggerEvent(element) { + var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + + // Bail if no element + if (!is$1.element(element) || is$1.empty(type)) { + return; + } // Create and dispatch the event + + + var event = new CustomEvent(type, { + bubbles: bubbles, + detail: _objectSpread2(_objectSpread2({}, detail), {}, { + plyr: this + }) + }); // Dispatch the event + + element.dispatchEvent(event); + } // Unbind all cached event listeners + + function unbindListeners() { + if (this && this.eventListeners) { + this.eventListeners.forEach(function (item) { + var element = item.element, + type = item.type, + callback = item.callback, + options = item.options; + element.removeEventListener(type, callback, options); + }); + this.eventListeners = []; + } + } // Run method when / if player is ready + + function ready() { + var _this3 = this; + + return new Promise(function (resolve) { + return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve); + }).then(function () {}); + } + + /** + * Silence a Promise-like object. + * This is useful for avoiding non-harmful, but potentially confusing "uncaught + * play promise" rejection error messages. + * @param {Object} value An object that may or may not be `Promise`-like. + */ + + function silencePromise(value) { + if (is$1.promise(value)) { + value.then(null, function () {}); + } + } + + function validateRatio(input) { + if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) { + return false; + } + + var ratio = is$1.array(input) ? input : input.split(':'); + return ratio.map(Number).every(is$1.number); + } + function reduceAspectRatio(ratio) { + if (!is$1.array(ratio) || !ratio.every(is$1.number)) { + return null; + } + + var _ratio = _slicedToArray(ratio, 2), + width = _ratio[0], + height = _ratio[1]; + + var getDivider = function getDivider(w, h) { + return h === 0 ? w : getDivider(h, w % h); + }; + + var divider = getDivider(width, height); + return [width / divider, height / divider]; + } + function getAspectRatio(input) { + var parse = function parse(ratio) { + return validateRatio(ratio) ? ratio.split(':').map(Number) : null; + }; // Try provided ratio + + + var ratio = parse(input); // Get from config + + if (ratio === null) { + ratio = parse(this.config.ratio); + } // Get from embed + + + if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) { + ratio = this.embed.ratio; + } // Get from HTML5 video + + + if (ratio === null && this.isHTML5) { + var _this$media = this.media, + videoWidth = _this$media.videoWidth, + videoHeight = _this$media.videoHeight; + ratio = reduceAspectRatio([videoWidth, videoHeight]); + } + + return ratio; + } // Set aspect ratio for responsive container + + function setAspectRatio(input) { + if (!this.isVideo) { + return {}; + } + + var wrapper = this.elements.wrapper; + var ratio = getAspectRatio.call(this, input); + + var _ref = is$1.array(ratio) ? ratio : [0, 0], + _ref2 = _slicedToArray(_ref, 2), + w = _ref2[0], + h = _ref2[1]; + + var padding = 100 / w * h; + wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra
to hide the standard controls and UI + + if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) { + var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10); + var offset = (height - padding) / (height / 50); + this.media.style.transform = "translateY(-".concat(offset, "%)"); + } else if (this.isHTML5) { + wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null); + } + + return { + padding: padding, + ratio: ratio + }; + } + + // ========================================================================== + var html5 = { + getSources: function getSources() { + var _this = this; + + if (!this.isHTML5) { + return []; + } + + var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified) + + return sources.filter(function (source) { + var type = source.getAttribute('type'); + + if (is$1.empty(type)) { + return true; + } + + return support.mime.call(_this, type); + }); + }, + // Get quality levels + getQualityOptions: function getQualityOptions() { + // Whether we're forcing all options (e.g. for streaming) + if (this.config.quality.forced) { + return this.config.quality.options; + } // Get sizes from elements + + + return html5.getSources.call(this).map(function (source) { + return Number(source.getAttribute('data-res')); + }).filter(Boolean); + }, + setup: function setup() { + if (!this.isHTML5) { + return; + } + + var player = this; // Set speed options from config + + player.options.speed = player.config.speed.options; // Set aspect ratio if fixed + + if (!is$1.empty(this.config.ratio)) { + setAspectRatio.call(player); + } // Quality + + + Object.defineProperty(player.media, 'quality', { + get: function get() { + // Get sources + var sources = html5.getSources.call(player); + var source = sources.find(function (s) { + return s.getAttribute('src') === player.source; + }); // Return size, if match is found + + return source && Number(source.getAttribute('data-res')); + }, + set: function set(input) { + if (player.quality === input) { + return; + } // If we're using an an external handler... + + + if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) { + player.config.quality.onChange(input); + } else { + // Get sources + var sources = html5.getSources.call(player); // Get first match for requested size + + var source = sources.find(function (s) { + return Number(s.getAttribute('data-res')) === input; + }); // No matching source found + + if (!source) { + return; + } // Get current state + + + var _player$media = player.media, + currentTime = _player$media.currentTime, + paused = _player$media.paused, + preload = _player$media.preload, + readyState = _player$media.readyState, + playbackRate = _player$media.playbackRate; // Set new source + + player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044) + + if (preload !== 'none' || readyState) { + // Restore time + player.once('loadedmetadata', function () { + player.speed = playbackRate; + player.currentTime = currentTime; // Resume playing + + if (!paused) { + silencePromise(player.play()); + } + }); // Load new source + + player.media.load(); + } + } // Trigger change event + + + triggerEvent.call(player, player.media, 'qualitychange', false, { + quality: input + }); + } + }); + }, + // Cancel current network requests + // See https://github.com/sampotts/plyr/issues/174 + cancelRequests: function cancelRequests() { + if (!this.isHTML5) { + return; + } // Remove child sources + + + removeElement(html5.getSources.call(this)); // Set blank video src attribute + // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error + // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection + + this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source + // This will cancel existing requests + // See https://github.com/sampotts/plyr/issues/174 + + this.media.load(); // Debugging + + this.debug.log('Cancelled network requests'); + } + }; + + // ========================================================================== + + function dedupe(array) { + if (!is$1.array(array)) { + return array; + } + + return array.filter(function (item, index) { + return array.indexOf(item) === index; + }); + } // Get the closest value in an array + + function closest$1(array, value) { + if (!is$1.array(array) || !array.length) { + return null; + } + + return array.reduce(function (prev, curr) { + return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev; + }); + } + + // ========================================================================== + + function generateId(prefix) { + return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000)); + } // Format string + + function format(input) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (is$1.empty(input)) { + return input; + } + + return input.toString().replace(/{(\d+)}/g, function (match, i) { + return args[i].toString(); + }); + } // Get percentage + + function getPercentage(current, max) { + if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) { + return 0; + } + + return (current / max * 100).toFixed(2); + } // Replace all occurances of a string in a string + + var replaceAll = function replaceAll() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ''; + return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString()); + }; // Convert to title case + + var toTitleCase = function toTitleCase() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + return input.toString().replace(/\w\S*/g, function (text) { + return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase(); + }); + }; // Convert string to pascalCase + + function toPascalCase() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var string = input.toString(); // Convert kebab case + + string = replaceAll(string, '-', ' '); // Convert snake case + + string = replaceAll(string, '_', ' '); // Convert to title case + + string = toTitleCase(string); // Convert to pascal case + + return replaceAll(string, ' ', ''); + } // Convert string to pascalCase + + function toCamelCase() { + var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var string = input.toString(); // Convert to pascal case + + string = toPascalCase(string); // Convert first character to lowercase + + return string.charAt(0).toLowerCase() + string.slice(1); + } // Remove HTML from a string + + function stripHTML(source) { + var fragment = document.createDocumentFragment(); + var element = document.createElement('div'); + fragment.appendChild(element); + element.innerHTML = source; + return fragment.firstChild.innerText; + } // Like outerHTML, but also works for DocumentFragment + + function getHTML(element) { + var wrapper = document.createElement('div'); + wrapper.appendChild(element); + return wrapper.innerHTML; + } + + var resources = { + pip: 'PIP', + airplay: 'AirPlay', + html5: 'HTML5', + vimeo: 'Vimeo', + youtube: 'YouTube' + }; + var i18n = { + get: function get() { + var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + if (is$1.empty(key) || is$1.empty(config)) { + return ''; + } + + var string = getDeep(config.i18n, key); + + if (is$1.empty(string)) { + if (Object.keys(resources).includes(key)) { + return resources[key]; + } + + return ''; + } + + var replace = { + '{seektime}': config.seekTime, + '{title}': config.title + }; + Object.entries(replace).forEach(function (_ref) { + var _ref2 = _slicedToArray(_ref, 2), + k = _ref2[0], + v = _ref2[1]; + + string = replaceAll(string, k, v); + }); + return string; + } + }; + + var Storage = /*#__PURE__*/function () { + function Storage(player) { + _classCallCheck(this, Storage); + + this.enabled = player.config.storage.enabled; + this.key = player.config.storage.key; + } // Check for actual support (see if we can use it) + + + _createClass(Storage, [{ + key: "get", + value: function get(key) { + if (!Storage.supported || !this.enabled) { + return null; + } + + var store = window.localStorage.getItem(this.key); + + if (is$1.empty(store)) { + return null; + } + + var json = JSON.parse(store); + return is$1.string(key) && key.length ? json[key] : json; + } + }, { + key: "set", + value: function set(object) { + // Bail if we don't have localStorage support or it's disabled + if (!Storage.supported || !this.enabled) { + return; + } // Can only store objectst + + + if (!is$1.object(object)) { + return; + } // Get current storage + + + var storage = this.get(); // Default to empty object + + if (is$1.empty(storage)) { + storage = {}; + } // Update the working copy of the values + + + extend(storage, object); // Update storage + + window.localStorage.setItem(this.key, JSON.stringify(storage)); + } + }], [{ + key: "supported", + get: function get() { + try { + if (!('localStorage' in window)) { + return false; + } + + var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode) + // see: https://github.com/sampotts/plyr/issues/131 + + window.localStorage.setItem(test, test); + window.localStorage.removeItem(test); + return true; + } catch (e) { + return false; + } + } + }]); + + return Storage; + }(); + + // ========================================================================== + // Fetch wrapper + // Using XHR to avoid issues with older browsers + // ========================================================================== + function fetch(url) { + var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text'; + return new Promise(function (resolve, reject) { + try { + var request = new XMLHttpRequest(); // Check for CORS support + + if (!('withCredentials' in request)) { + return; + } + + request.addEventListener('load', function () { + if (responseType === 'text') { + try { + resolve(JSON.parse(request.responseText)); + } catch (e) { + resolve(request.responseText); + } + } else { + resolve(request.response); + } + }); + request.addEventListener('error', function () { + throw new Error(request.status); + }); + request.open('GET', url, true); // Set the required response type + + request.responseType = responseType; + request.send(); + } catch (e) { + reject(e); + } + }); + } + + // ========================================================================== + + function loadSprite(url, id) { + if (!is$1.string(url)) { + return; + } + + var prefix = 'cache'; + var hasId = is$1.string(id); + var isCached = false; + + var exists = function exists() { + return document.getElementById(id) !== null; + }; + + var update = function update(container, data) { + // eslint-disable-next-line no-param-reassign + container.innerHTML = data; // Check again incase of race condition + + if (hasId && exists()) { + return; + } // Inject the SVG to the body + + + document.body.insertAdjacentElement('afterbegin', container); + }; // Only load once if ID set + + + if (!hasId || !exists()) { + var useStorage = Storage.supported; // Create container + + var container = document.createElement('div'); + container.setAttribute('hidden', ''); + + if (hasId) { + container.setAttribute('id', id); + } // Check in cache + + + if (useStorage) { + var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id)); + isCached = cached !== null; + + if (isCached) { + var data = JSON.parse(cached); + update(container, data.content); + } + } // Get the sprite + + + fetch(url).then(function (result) { + if (is$1.empty(result)) { + return; + } + + if (useStorage) { + window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({ + content: result + })); + } + + update(container, result); + }).catch(function () {}); + } + } + + // ========================================================================== + + var getHours = function getHours(value) { + return Math.trunc(value / 60 / 60 % 60, 10); + }; + var getMinutes = function getMinutes(value) { + return Math.trunc(value / 60 % 60, 10); + }; + var getSeconds = function getSeconds(value) { + return Math.trunc(value % 60, 10); + }; // Format time to UI friendly string + + function formatTime() { + var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + // Bail if the value isn't a number + if (!is$1.number(time)) { + return formatTime(undefined, displayHours, inverted); + } // Format time component to add leading zero + + + var format = function format(value) { + return "0".concat(value).slice(-2); + }; // Breakdown to hours, mins, secs + + + var hours = getHours(time); + var mins = getMinutes(time); + var secs = getSeconds(time); // Do we need to display hours? + + if (displayHours || hours > 0) { + hours = "".concat(hours, ":"); + } else { + hours = ''; + } // Render + + + return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs)); + } + + var controls = { + // Get icon URL + getIconUrl: function getIconUrl() { + var url = new URL(this.config.iconUrl, window.location); + var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody; + return { + url: this.config.iconUrl, + cors: cors + }; + }, + // Find the UI controls + findElements: function findElements() { + try { + this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons + + this.elements.buttons = { + play: getElements.call(this, this.config.selectors.buttons.play), + pause: getElement.call(this, this.config.selectors.buttons.pause), + restart: getElement.call(this, this.config.selectors.buttons.restart), + rewind: getElement.call(this, this.config.selectors.buttons.rewind), + fastForward: getElement.call(this, this.config.selectors.buttons.fastForward), + mute: getElement.call(this, this.config.selectors.buttons.mute), + pip: getElement.call(this, this.config.selectors.buttons.pip), + airplay: getElement.call(this, this.config.selectors.buttons.airplay), + settings: getElement.call(this, this.config.selectors.buttons.settings), + captions: getElement.call(this, this.config.selectors.buttons.captions), + fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen) + }; // Progress + + this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs + + this.elements.inputs = { + seek: getElement.call(this, this.config.selectors.inputs.seek), + volume: getElement.call(this, this.config.selectors.inputs.volume) + }; // Display + + this.elements.display = { + buffer: getElement.call(this, this.config.selectors.display.buffer), + currentTime: getElement.call(this, this.config.selectors.display.currentTime), + duration: getElement.call(this, this.config.selectors.display.duration) + }; // Seek tooltip + + if (is$1.element(this.elements.progress)) { + this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip)); + } + + return true; + } catch (error) { + // Log it + this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls + + this.toggleNativeControls(true); + return false; + } + }, + // Create icon + createIcon: function createIcon(type, attributes) { + var namespace = 'http://www.w3.org/2000/svg'; + var iconUrl = controls.getIconUrl.call(this); + var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create + + var icon = document.createElementNS(namespace, 'svg'); + setAttributes(icon, extend(attributes, { + 'aria-hidden': 'true', + focusable: 'false' + })); // Create the to reference sprite + + var use = document.createElementNS(namespace, 'use'); + var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes + // https://github.com/sampotts/plyr/issues/460 + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href + + if ('href' in use) { + use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); + } // Always set the older attribute even though it's "deprecated" (it'll be around for ages) + + + use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add to + + icon.appendChild(use); + return icon; + }, + // Create hidden text label + createLabel: function createLabel(key) { + var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var text = i18n.get(key, this.config); + + var attributes = _objectSpread2(_objectSpread2({}, attr), {}, { + class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ') + }); + + return createElement('span', attributes, text); + }, + // Create a badge + createBadge: function createBadge(text) { + if (is$1.empty(text)) { + return null; + } + + var badge = createElement('span', { + class: this.config.classNames.menu.value + }); + badge.appendChild(createElement('span', { + class: this.config.classNames.menu.badge + }, text)); + return badge; + }, + // Create a
if needed + + if (is$1.empty(source)) { + source = player.media.getAttribute(player.config.attributes.embed.id); + } + + var id = parseId(source); // Build an iframe + + var iframe = createElement('iframe'); + var src = format(player.config.urls.vimeo.iframe, id, params); + iframe.setAttribute('src', src); + iframe.setAttribute('allowfullscreen', ''); + iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required + + if (!is$1.empty(referrerPolicy)) { + iframe.setAttribute('referrerPolicy', referrerPolicy); + } // Inject the package + + + var poster = player.poster; + + if (premium) { + iframe.setAttribute('data-poster', poster); + player.media = replaceElement(iframe, player.media); + } else { + var wrapper = createElement('div', { + class: player.config.classNames.embedContainer, + 'data-poster': poster + }); + wrapper.appendChild(iframe); + player.media = replaceElement(wrapper, player.media); + } // Get poster image + + + fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) { + if (is$1.empty(response)) { + return; + } // Get the URL for thumbnail + + + var url = new URL(response[0].thumbnail_large); // Get original image + + url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster + + ui.setPoster.call(player, url.href).catch(function () {}); + }); // Setup instance + // https://github.com/vimeo/player.js + + player.embed = new window.Vimeo.Player(iframe, { + autopause: player.config.autopause, + muted: player.muted + }); + player.media.paused = true; + player.media.currentTime = 0; // Disable native text track rendering + + if (player.supported.ui) { + player.embed.disableTextTrack(); + } // Create a faux HTML5 API using the Vimeo API + + + player.media.play = function () { + assurePlaybackState.call(player, true); + return player.embed.play(); + }; + + player.media.pause = function () { + assurePlaybackState.call(player, false); + return player.embed.pause(); + }; + + player.media.stop = function () { + player.pause(); + player.currentTime = 0; + }; // Seeking + + + var currentTime = player.media.currentTime; + Object.defineProperty(player.media, 'currentTime', { + get: function get() { + return currentTime; + }, + set: function set(time) { + // Vimeo will automatically play on seek if the video hasn't been played before + // Get current paused state and volume etc + var embed = player.embed, + media = player.media, + paused = player.paused, + volume = player.volume; + var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event + + media.seeking = true; + triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete + + Promise.resolve(restorePause && embed.setVolume(0)) // Seek + .then(function () { + return embed.setCurrentTime(time); + }) // Restore paused + .then(function () { + return restorePause && embed.pause(); + }) // Restore volume + .then(function () { + return restorePause && embed.setVolume(volume); + }).catch(function () {// Do nothing + }); + } + }); // Playback speed + + var speed = player.config.speed.selected; + Object.defineProperty(player.media, 'playbackRate', { + get: function get() { + return speed; + }, + set: function set(input) { + player.embed.setPlaybackRate(input).then(function () { + speed = input; + triggerEvent.call(player, player.media, 'ratechange'); + }).catch(function () { + // Cannot set Playback Rate, Video is probably not on Pro account + player.options.speed = [1]; + }); + } + }); // Volume + + var volume = player.config.volume; + Object.defineProperty(player.media, 'volume', { + get: function get() { + return volume; + }, + set: function set(input) { + player.embed.setVolume(input).then(function () { + volume = input; + triggerEvent.call(player, player.media, 'volumechange'); + }); + } + }); // Muted + + var muted = player.config.muted; + Object.defineProperty(player.media, 'muted', { + get: function get() { + return muted; + }, + set: function set(input) { + var toggle = is$1.boolean(input) ? input : false; + player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () { + muted = toggle; + triggerEvent.call(player, player.media, 'volumechange'); + }); + } + }); // Loop + + var loop = player.config.loop; + Object.defineProperty(player.media, 'loop', { + get: function get() { + return loop; + }, + set: function set(input) { + var toggle = is$1.boolean(input) ? input : player.config.loop.active; + player.embed.setLoop(toggle).then(function () { + loop = toggle; + }); + } + }); // Source + + var currentSrc; + player.embed.getVideoUrl().then(function (value) { + currentSrc = value; + controls.setDownloadUrl.call(player); + }).catch(function (error) { + _this.debug.warn(error); + }); + Object.defineProperty(player.media, 'currentSrc', { + get: function get() { + return currentSrc; + } + }); // Ended + + Object.defineProperty(player.media, 'ended', { + get: function get() { + return player.currentTime === player.duration; + } + }); // Set aspect ratio based on video size + + Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) { + var _dimensions = _slicedToArray(dimensions, 2), + width = _dimensions[0], + height = _dimensions[1]; + + player.embed.ratio = [width, height]; + setAspectRatio.call(_this); + }); // Set autopause + + player.embed.setAutopause(player.config.autopause).then(function (state) { + player.config.autopause = state; + }); // Get title + + player.embed.getVideoTitle().then(function (title) { + player.config.title = title; + ui.setTitle.call(_this); + }); // Get current time + + player.embed.getCurrentTime().then(function (value) { + currentTime = value; + triggerEvent.call(player, player.media, 'timeupdate'); + }); // Get duration + + player.embed.getDuration().then(function (value) { + player.media.duration = value; + triggerEvent.call(player, player.media, 'durationchange'); + }); // Get captions + + player.embed.getTextTracks().then(function (tracks) { + player.media.textTracks = tracks; + captions.setup.call(player); + }); + player.embed.on('cuechange', function (_ref) { + var _ref$cues = _ref.cues, + cues = _ref$cues === void 0 ? [] : _ref$cues; + var strippedCues = cues.map(function (cue) { + return stripHTML(cue.text); + }); + captions.updateCues.call(player, strippedCues); + }); + player.embed.on('loaded', function () { + // Assure state and events are updated on autoplay + player.embed.getPaused().then(function (paused) { + assurePlaybackState.call(player, !paused); + + if (!paused) { + triggerEvent.call(player, player.media, 'playing'); + } + }); + + if (is$1.element(player.embed.element) && player.supported.ui) { + var frame = player.embed.element; // Fix keyboard focus issues + // https://github.com/sampotts/plyr/issues/317 + + frame.setAttribute('tabindex', -1); + } + }); + player.embed.on('bufferstart', function () { + triggerEvent.call(player, player.media, 'waiting'); + }); + player.embed.on('bufferend', function () { + triggerEvent.call(player, player.media, 'playing'); + }); + player.embed.on('play', function () { + assurePlaybackState.call(player, true); + triggerEvent.call(player, player.media, 'playing'); + }); + player.embed.on('pause', function () { + assurePlaybackState.call(player, false); + }); + player.embed.on('timeupdate', function (data) { + player.media.seeking = false; + currentTime = data.seconds; + triggerEvent.call(player, player.media, 'timeupdate'); + }); + player.embed.on('progress', function (data) { + player.media.buffered = data.percent; + triggerEvent.call(player, player.media, 'progress'); // Check all loaded + + if (parseInt(data.percent, 10) === 1) { + triggerEvent.call(player, player.media, 'canplaythrough'); + } // Get duration as if we do it before load, it gives an incorrect value + // https://github.com/sampotts/plyr/issues/891 + + + player.embed.getDuration().then(function (value) { + if (value !== player.media.duration) { + player.media.duration = value; + triggerEvent.call(player, player.media, 'durationchange'); + } + }); + }); + player.embed.on('seeked', function () { + player.media.seeking = false; + triggerEvent.call(player, player.media, 'seeked'); + }); + player.embed.on('ended', function () { + player.media.paused = true; + triggerEvent.call(player, player.media, 'ended'); + }); + player.embed.on('error', function (detail) { + player.media.error = detail; + triggerEvent.call(player, player.media, 'error'); + }); // Rebuild UI + + setTimeout(function () { + return ui.build.call(player); + }, 0); + } + }; + + // ========================================================================== + + function parseId$1(url) { + if (is$1.empty(url)) { + return null; + } + + var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/; + return url.match(regex) ? RegExp.$2 : url; + } // Set playback state and trigger change (only on actual change) + + + function assurePlaybackState$1(play) { + if (play && !this.embed.hasPlayed) { + this.embed.hasPlayed = true; + } + + if (this.media.paused === play) { + this.media.paused = !play; + triggerEvent.call(this, this.media, play ? 'play' : 'pause'); + } + } + + function getHost(config) { + if (config.noCookie) { + return 'https://www.youtube-nocookie.com'; + } + + if (window.location.protocol === 'http:') { + return 'http://www.youtube.com'; + } // Use YouTube's default + + + return undefined; + } + + var youtube = { + setup: function setup() { + var _this = this; + + // Add embed class for responsive + toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API + + if (is$1.object(window.YT) && is$1.function(window.YT.Player)) { + youtube.ready.call(this); + } else { + // Reference current global callback + var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue + + window.onYouTubeIframeAPIReady = function () { + // Call global callback if set + if (is$1.function(callback)) { + callback(); + } + + youtube.ready.call(_this); + }; // Load the SDK + + + loadScript(this.config.urls.youtube.sdk).catch(function (error) { + _this.debug.warn('YouTube API failed to load', error); + }); + } + }, + // Get the media title + getTitle: function getTitle(videoId) { + var _this2 = this; + + var url = format(this.config.urls.youtube.api, videoId); + fetch(url).then(function (data) { + if (is$1.object(data)) { + var title = data.title, + height = data.height, + width = data.width; // Set title + + _this2.config.title = title; + ui.setTitle.call(_this2); // Set aspect ratio + + _this2.embed.ratio = [width, height]; + } + + setAspectRatio.call(_this2); + }).catch(function () { + // Set aspect ratio + setAspectRatio.call(_this2); + }); + }, + // API ready + ready: function ready() { + var player = this; // Ignore already setup (race condition) + + var currentId = player.media && player.media.getAttribute('id'); + + if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) { + return; + } // Get the source URL or ID + + + var source = player.media.getAttribute('src'); // Get from
if needed + + if (is$1.empty(source)) { + source = player.media.getAttribute(this.config.attributes.embed.id); + } // Replace the